高性能web架构主要保证程序的高可用性和高并发性.
高可用就是 保证程序在99.99%的情况下可以使用,不会因为单机节点故障整体崩溃.
高并发说到底也是为了高可用服务.保证在大量并发的时候服务不会宕机.
高性能web架构主要体现在以下方面
- 数据库读写分离,因为大部分应用都是读多于写,可以配置多台读服务器, (目前mysql不支持多台写服务器,不过可以用其他技术解决)
- 缓存常用数据,把访问量非常多的数据,缓存到分布式缓存中. 如memcached,redis 等常用缓存方案
- 单独文件服务器集群,减少对应用服务器压力
- 单独图片服务器集群, 减少对应用服务器压力
- web服务器和应用服务器集群分离. web 服务器并发要比应用服务器并发高很多. 缓解应用服务器压力.
- 应用服务器集群,做负载均衡,对话共享.应用服务器目前都支持集群,
- 服务器反向代理 ,
一般高并发第一个瓶颈就在数据库所以数据库读写分离很实用.
安装虚拟机
安装两个linux 虚拟机 , 我是在macosx 中用vbox虚拟机安装的两个centos6.5 i386 虚拟机
安装的时候硬盘保证在20G以上,否则安装系统报错
VBox安装的时候 如果用mac 会提示CPU不支持
选择设置à系统->处理器->勾选PAE/NX
安装完系统后进入系统
安装之后保证虚拟机联网, 因为安装程序都是用yum 安装的
配置虚拟机
关闭安全策略
关闭iptables防火墙(或者打开防火墙的1186、3306端口),在Shell中运行以下命令:
chkconfig --level 35 iptables off
设置虚拟机与主机网络为桥接网络,使虚拟机加入主机的局域网中
设置->网络->桥接模式
二 安装MySQL
1. 卸载掉原有mysql
// 这个命令就会查看该操作系统上是否已经安装了mysql数据库
[root@xiaoluo ~]# rpm -qa |grep mysql
有的话,我们就通过 rpm -e 命令 或者 rpm -e--nodeps 命令来卸载掉
// 普通删除模式
[root@xiaoluo ~]# rpm -emysql
// 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
[root@xiaoluo ~]# rpm -e--nodeps mysql
2. 通过yum来进行mysql的安装
[root@xiaoluo ~]# yuminstall -y mysql-server mysql mysql-deve
yum会帮我们选择好安装mysql数据库所需要的软件以及其它附属的一些软件
此时我们可以通过如下命令,查看刚安装好的mysql-server的版本
[root@xiaoluo ~]# rpm -qimysql-server
启动mysql
[root@xiaoluo ~]# servicemysqld restart
设置开机启动
[root@xiaoluo ~]# chkconfigmysqld on
3. mysql数据库的初始化及相关配置
这时我们会看到第一次启动mysql服务器以后会提示非常多的信息,目的就是对mysql数据库进行初始化操作,当我们再次重新启动mysql服务时,就不会提示这么多信息了.
修改root密码 ,这个只有安装第一次设置有效
[root@xiaoluo ~]# mysqladmin-u root password 'root'
此时我们就可以通过 mysql -u root -p 命令来登录我们的mysql数据库了
三 复制虚拟机
将安装好mysql的centos 复制一份,读写分离至少两台服务器,一个读,一个写.
启动两台虚拟机
四 配置读写分离数据库
在两台服务器中执行ifconfig 查看IP
在windows虚拟机中用SQLyog连接两台mysql root用户
(注意新安装的mysql root用户是不允许被非主机连接的,需要在主机上执行一个sql)
首先主机登录MySQl 用 mysql -u root –p 登录mysql
//切换数据库
mysql> use mysql
//修改权限
mysql>GRANT ALLPRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION
//使修改生效
mysql>FLUSH PRIVILEGES
//退出MySQL服务器
mysql>EXIT
此时就可以连了
配置master server-1
首先创建一个测试数据库,并手动把这个库复制到从库mysql中
执行 vi /etc/my.cnf 添加以下配置:
log-bin=mysql-bin #slave基于此log-bin来做replication
server-id=1 #master的标示
执行重启
/etc/init.d/mysqld restart
然后添加专门用于replication的用户:
最后查看master状态:
SHOW MASTER STATUS;
SHOW PROCESSLIST ; 查看用户线程状态
配置从数据库
执行 vi /etc/my.cnf 添加以下配置:
server-id=2 #slave的标示
read_only = 1
replicate-do-db=jialixin 告诉slave只做vbb数据库的更新
replicate-ignore-db=mysql #不同步的数据库
#replicate-ignore-table=vbb.users#不同步vbb数据库的users表
执行重启
/etc/init.d/mysqld restart
在mysql客户端执行以下sql
CHANGE MASTER TO
MASTER_HOST='192.168.4.24',
MASTER_USER='repl-jialixin',
MASTER_PASSWORD='jialixin',
MASTER_LOG_FILE='mysql-bin.000002', --这个值要 在master的机器中查出来 show master status; 中
MASTER_LOG_POS=106;-- 这个值要 在master的机器中查出来 show master status; 中
在mysql客户端执行以下sql
START SLAVE; --开始
查看从库mysql日志,执行以下命令
cat /var/log/mysqld.log
如果出现下边的日志就证明没问题了
在主库里边修改数据库的信息, 看看从库里边会不会跟着修改, 如果从库没有变化
在mysql客户端执行以下sql
SHOW SLAVE STATUS;
查看信息, 看看同步的日志MASTER_LOG_POS 是不是一致,再查看 last_sql_error有没有信息,
在mysql客户端执行以下sql
SHOW PROCESSLIST ;-- 查看用户线程状态
注意:
1,配置读写分离的时候一定停止所有对数据库的读写操作
2,开始的之前一定保证读写两个服务器的所有数据库内容相同.
3,可以配置多个从库作为读的数据库
以上是简单的读写分离的架构搭建更多复杂的请参考
http://blog.csdn.net/hguisu/article/details/7325124
配置代理读写分离
此次实战中database proxy采用amoeba ,它的相关信息可以查阅官方文档,不在此详述
本文使用2.0版本 请下载2.0
下载https://sourceforge.net/projects/amoeba/files/
下载后解压
打开conf/ amoeba.xml配置文件,修改以下位置
这个service是提供给访问数据库的程序使用的.也就是别人连接数据库需要配置的东西
分别为,端口,默认为8066,为了大家习惯,改成3306
用户名:可以随便写
密码:可以随便写
最下边把注释打开,配置server1,server2,这里边对应的是dbServers.xml 配置文件里边的两个数据库server
打开dbServers.xml,配置 端口,用户名,密码
增加一个server, 这里边的name对应上一个配置文件里边的server 读写的配置 .24是写数据库,.25是读库,因为两个库的用户名密码都一样的,所以直接继承上面的server配置的信息就可以了.如果不一样需要单独配置.最下边是连接池配置.
然后保存,启动
打开cmd 切换到bin目录
amoeba start 启动, 如果配置环境变量了,可以直接启动.否则需要切换到程序目录下.
启动成功,下边用程序测试以下. 下边是spring的连接信息, 连接到amoeba
运行测试
插入成功.
可以看到两个数据库都已经同步了. 查看数据库日志,写发生在24上,读发生在25 上