首页 > 代码库 > mysql主从同步、读写分离

mysql主从同步、读写分离

一:所需服务器

服务器名称

运行服务

服务端口

Ip地址


T1

Nginx

80

192.168.11.158

负载均衡

T2

Nginx/httpd

80873

192.168.11.157

实际网站服务

T3

Nginx/httpd

80873

192.168.11.161

实际网站服务

T4

Nginx/httpd

80873

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变两台服务器,即T1T6

  3,再分离T6,即T6也做读写分离服务,新增T7

  4T1分离成T1,T2。。。。。,T1最终只做负载。

      5,分离T6只做mysql写服务,新增T5,程序代码服务器连接改成T5IP8066

         端口,并可新增T8,变成最终的情况

      6T9前期可以不用,由T1负责即可。后面T1负载太大,独立出来。

      7,负载加大,这时考虑用LVS或硬件的负载均衡。

二:搭建过程

1web服务和rsync服务

  1T1-T4全做成LNMP服务。过程这里不做详细说明。可以下载一键安装包即可解决

         T1nginx需要另外写入如下代码:(各有不同,可百度)

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服务就搭建完成。

   2rsync服务

          安装xinetdrsync的守护进程

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

 

正常会显示传输的情况,如果不对,请自行百度。一般是权限和端口的问题。

2T9:安装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服务器的地址 namersync的模块,这个可以有多个。

      <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主从同步、读写分离