mysql主從同步、讀寫分離

原理部分就不多做介紹了,有需求請移步這位博友的文章

http://xiaorenwutest.blog.51cto.com/12754924/1920259

下面給出某企業平臺實例

一:所需服務器

服務器名稱

運行服務

服務端口

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/* [email protected]::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   #(回車後輸入密碼)

 

 

請自行建表或插入數據測試,至此,數據庫的主從同步,讀寫分離搭建完成。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章