首页 > 代码库 > mysql主从同步、读写分离
mysql主从同步、读写分离
一:所需服务器
服务器名称 | 运行服务 | 服务端口 | Ip地址 | |
T1 | Nginx | 80 | 192.168.11.158 | 负载均衡 |
T2 | Nginx/httpd | 80,873 | 192.168.11.157 | 实际网站服务 |
T3 | Nginx/httpd | 80,873 | 192.168.11.161 | 实际网站服务 |
T4 | Nginx/httpd | 80,873 | 192.168.11.162 | 实际网站服务 |
T5 | Mysql | 8066 | 192.168.11.163 | Mysql读写分离 |
T6 | mysql | 3306 | 192.168.11.164 | Mysql主,写 |
T7 | mysql | 3306 | 192.168.11.165 | Mysql从,读 |
T8 | mysql | 3306 | 192.168.11.167 | Mysql从,读 |
T9 | Sersync+ftp | 21 | 192.168.11.156 | 网站存放,上传 |
说明:1,前期可只有T1,只有一台服务器提供所有的服务。
2,先分离mysql变两台服务器,即T1和T6
3,再分离T6,即T6也做读写分离服务,新增T7
4,T1分离成T1,T2。。。。。,T1最终只做负载。
5,分离T6只做mysql写服务,新增T5,程序代码服务器连接改成T5的IP和8066
端口,并可新增T8,变成最终的情况
6,T9前期可以不用,由T1负责即可。后面T1负载太大,独立出来。
7,负载加大,这时考虑用LVS或硬件的负载均衡。
二:搭建过程
1,web服务和rsync服务
1)T1-T4全做成LNMP服务。过程这里不做详细说明。可以下载一键安装包即可解决
T1的nginx需要另外写入如下代码:(各有不同,可百度)
upstream 127.0.0.1 { #前面的127.0.0.1换成网站域名
#这里就是T2-T4服务器地址,需要根据实际情况填写
server 192.168.11.157;
server 192.168.11.161;
server 192.168.11.162;
}
server {
listen 80;
server_name yhzxq.eicp.net; #网站域名,最好把www和没有www的都填上
access_log /data/wwwlogs/yhzxq.eicp.net_nginx.log combined;
#日志路径,方便查看客户登陆情况
location / {
proxy_pass http://127.0.0.1; #网站域名
}
这样,WEB服务就搭建完成。
2)rsync服务
安装xinetd,rsync的守护进程
yum install xinetd -y (前面要小写)
编写rsyncd.conf
vim /etc/rsyncd.conf #内容如下:
uid = root
gid = root
max connections = 2
strict modes = yes
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
secrets file = /etc/rsync.pas #同步密码文件,安全考虑,有那个auth users=就必须有这个
[www]
path = /data/www/
comment = This is Mysql db backup
ignore errors
list = no
read only =no
auth users = zxq #同步的用户
#hosts allow = 115.29.227.109 #这里是添加信任站点,对于云服务器来说非常重要
#hosts allow = 192.168.11.252 #即允许T9来访问。当然,在IPTABLES里控制也可以。
编写密码文件vim /etc/rsync.pas (文件名对应secrets file选项)内容如下:
zxq:123456 (用户名+‘:’+密码)
chmod 600 /etc/rsync.pas (密码文件必须用这个权限)
IPTABLES开放873端口,重启IPTABLES ,重启xinted
Netstat -ln |grep 873 #查看rsync服务是否运行。
测试:客户机先建立密码文件内容是123456(同rsync服务器那有点不同,这里只需要密码,不要写用户名,权限同样是600)
Rsync -az --delete --password-file=/.etc/rsync.pas /tmp/* zxq@192.168.11.157::www
正常会显示传输的情况,如果不对,请自行百度。一般是权限和端口的问题。
2,T9:安装VSFTP,参考http://xrzxq.eicp.net/?id=5(本人博客)
完成后可以把添加用户的脚本加上,注意路径即可。
1)搭建sersync
环境检测:
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances = 128
修改参数:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
vi /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
按:w保存退出。
Sersync下载链接:http://pan.baidu.com/s/1dEdyDAp 密码:mb8p 好后上传到服务器。或者
wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
解压,并把文件移到./usr/local./sersync下面,再修改相关的配置文件
vim /usr/local/sersync/confxml.xml(最好先备份一下,只改以下红色的部份)
<sersync>
<localpath watch="/home/www.osyunwei.com">
<remote ip="192.168.21.127" name="home_www.osyunwei.com"/>
<remote ip="192.168.21.128" name="home_www.osyunwei.com"/>
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="home_www.osyunwei.com_user" passwordfile="/etc/passwd.txt"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->
解释:<localpath watch>这是源路径,需同步的都放在这里,同时这也是FTP上传路径。
<remote ip>这是rsync服务器的地址 name是rsync的模块,这个可以有多个。
<auth start>开始,users=这是rsync服务器的同步用户,后面的是密码文件路径。
<crontab start>这里设置全同步时间,600分钟同步一次。注意,后面有脚本,每5分钟检查一次有没有运行(时间当然可以自定义)。
设置sersync开机启动
vim /etc/rc.local
添加/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
创建脚本:
vim ~/script/check_sersync.sh
#!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep ‘sersync2‘|grep -v ‘grep‘|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi
按:w保存,并在crontab里添加每5分钟执行一次,重启服务器。
完成重启后,在WEB那几台服务器上查看是否有文件同步过来即可。
当然,有错可以先看日志,百度。
至此,web服务器搭建完成。
MYSQL:
T6-T8安装mysql5.7服务,(注意,5.6版本不支持明文密码备份,5.7虽然也有提示,但备份成功)到搜狐源下载编译版本,解压到/usr/local/mysql下面,并编辑/etc/profile文件,新增mysql路径/usr/local/mysql/bin
1,MYSQL安装
1)新增mysql运行用户
useradd mysql -s /sbin/nologin
创建数据保存目录,注意,可以先用df 查看一下分区情况,选择空间比较大的分区存放
mkdir /data/mysql -p
用/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql
Mysql安装过程中会产生随机密码,注意记录,会用这个密码登录来修改自己的密码的。
安装好后,用刚记录的密码登陆mysql
mysql -uroot -p(密码)
use mysql
set password for root@’localhost’=password(‘new_password’);
flush privileges;
设置新密码成功。
2)主从同步的设置
在主服务器里新增一个用于同步的帐号:
grant all privelieges on *.* to ‘root‘@‘%‘ identified by ‘123!@#qwe‘;
%表示任何主机都可以连接,by 后面的是密码,设置可以复杂一点
这需要在iptables里做安全设置
修改my.cnf,增加以下内容:
server-id=1
log-bin=XXX #同步的标示符,二进制文件名,可以自义
binlog-do-db=your_DB #同步的数据库,可以有多个,用逗号隔开
log-slave-updates
sync_binlog=1
auto-increment-increment=2
auto-increment-offset=1
slave-skip-errors=all
设置完成,重启mysql:/etc/init.d/mysqld restart
在从服务器里,修改my.cnf
server-id=2
log-bin=XXX #同步的标示符,与主那边一致
replicate-do-db = mydb #同步的数据库,与主那边的binlog-do-db对应
log-slave-updates
sync_binlog=1
auto-increment-increment=2
auto-increment-offset=2 #这是用来区分服务器的,如还有,则设置成不同
slave-skip-errors=all
设置完成,重启mysql,并进入到数据库里
导入完同步的数据库,打入以下命令
stop slave;
reset slave;
change master to master_host=’主服务器地址’,master_user=’刚设置的同步用户’,master_password=’刚设置的同步用户的密码’;
(一般情况下,同步完成,如果出错,请自行百度一下,根据出错的提示解决,一定要小心检查)
这时,同步设置完成,
Start slave; (开启同步)
Show slave status \G(注意,这里用\G表示命令结束,这样看提示信息比较好看)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
确保信息里,以上提示为yes,同步即成功。
2,安装amoeba
简单介绍一下amoeba是阿里巴巴旗下的开源软件,专为mysql等做负载或读写用的。
基于java开发,所以要先安装java支持。
到http://java.sun.com/javase/downloads/index.jsp下载java
现在是rpm的安装包,用rpm -ivh 安装即可。
使用java -version查看安装的版本号
java version "1.8.0_74" #这是我的版本
现在,添加java路径,注意,这里网上教程都有不太对的地方。
实际上要添加的路径是java下的jre的路径,可用find命令查找一下。一般在/usr/java/jdk1.8.0_74/jre/bin/java
编辑/etc/profile添加
JAVA_HOME=/usr/java/jdk1.8.0_74
PATH=$PATH:JAVA_HOME/bin
export JAVA_HOME PATH
:w保存
source /etc/profile 即可
这时就可以用amoeba了,但一般运行后会马上提示堆栈不够,这是因为amoeba里定义得太少了,修改amoeba文件即可
vim /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"(这是改后的,一般是128k)
修改amoeba的配置文件,这里主要是两个xml文件:dbServer.xml amoeba.xml
它们都在conf文件夹下,两个文件里关于用户的定义一定相同,也即是有数据库使用权限的用户
Amoeba.xml:
<property name="port">3306</property> #数据库的访问端口
<!-- mysql schema -->
<property name="schema">wordpress</property> #同步的数据库,注意这里只支持一个库,所以主从同步时设置多个库也好,在这里只有一个可以做读写分离的
<!-- mysql user -->
<property name="user">zxq</property> #访问数据库的用户
<property name="password">123!@#qwe</property> #对应用户的密码
dbServer.xml:
关于用户密码的配置和amoeba相同,不同的是这里可以配置多台服务器的信息
<dbServer name="server1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.11.164</property>
</factoryConfig>
</dbServer>
以上是一台机的配置,主要是填写IP地址。
好了以后可用amoeba start & 后台运行
netstat -ln |grep 8066 检测有没有运行,注意使用端口
安装一个mysql客户端,使用mysql登陆试试看,注意端口
Mysql -u zxq -p -h 192.168.11.164 -P8066 #(回车后输入密码)
请自行建表或插入数据测试,至此,数据库的主从同步,读写分离搭建完成。
mysql主从同步、读写分离