1. 程式人生 > >mysql叢集一:主從複製,通過mysql-proxy做負載均衡

mysql叢集一:主從複製,通過mysql-proxy做負載均衡

mysql叢集架構方式很多,根據不同的需求做不一樣的架構,簡單一點的就是mysql的replication,也就是Mysql的複製功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多個分層,那麼現在我所要說的是master-slaves的模式(其他的模式原理基本都一樣),然後再通過mysql官方提供的Mysql-proxy實現讀寫分離,達到負載均衡的效果。

環境:

  主機:master:192.168.1.109,slave1:192.168.1.110,mysqlProxy:192.168.1.112

。(workstation10平臺建立虛擬機器模擬)

  作業系統:Red Hat Enterprise Linux Server release 5.8

  mysql:mysql-5.5.37-linux2.6-i686.tar.gz

  mysql-proxy:mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit.tar.gz

 

1、安裝mysql:

[[email protected] ~]# cd /usr/local  //進入到安裝目錄

[[email protected] local]# tar -zxvf mysql-5.5.37-linux2.6-i686.tar.gz    //解壓mysql二進位制包

[[email protected] local]# ln -s mysql-5.5.37-linux2.6-i686 mysql  //解壓之後加上鍊接

[[email protected] local]# groupadd mysql  //增加mysql使用者組

[[email protected] local]# useradd -g mysql mysql  //增加mysql使用者帳號

[[email protected] local]# cd mysql  //進入安裝之後的mysql目錄

[[email protected]

mysql]# chown -R root:mysql .  //修改檔案屬組和屬主,注意該命令後面有一個點,表示當前目錄

[[email protected] mysql]# chown -R mysql:mysql data/  //把data目錄的屬主改為mysql

[[email protected] mysql]# cp support-files/my-large.cnf /etc/my.cnf  //拷貝mysql配置檔案放在etc目錄下並改名為my.cnf

[[email protected] mysql]# cp support-files/mysql.server /etc/init.d/mysqld  //拷貝mysql的啟動指令碼放在/etc/init.d/目錄下

[[email protected] mysql]# service mysqld start  //啟動mysql

至此mysql安裝已經結束,接下來就是mysql的主從配置。(其他兩臺主機也照此安裝mysql)

 

2、配置master

[[email protected] mysql]# vi /etc/my.cnf  //編輯配置檔案

server-id=1  //預設是1,不是的話則改為1

thread_concurrency = 2  //執行緒併發數(CPU*2)

log-bin=mysql-bin  //開啟二進位制日誌功能

儲存退出,重新啟動mysql。

登入mysql:

[[email protected] mysql]# mysql -uroot -p  //預設密碼空,直接敲回車進入

mysql> grant replication slave on *.* to [email protected]‘192.168.1.%‘ identified by ‘123456‘;

mysql>flush privileges;

mysql>show grants for ‘repl‘@‘192.168.1.%‘;  //檢視授權,有記錄說明ok

mysql>show master status\G;  //檢視master伺服器狀態,有二進位制日誌檔名和記錄位置(position)

至此mysql配置完成。

 

3、配置slave

[[email protected] mysql]#vi /etc/my.cnf  //編輯配置檔案

server-id=11  //設定與master不一樣就行,

thread_concurrency = 2  //執行緒併發數(CPU*2)

relay-log=mysql-log  //開啟中繼日誌

relay-log-index=mysql-log.index  //設定relay-log-index檔名

儲存退出,重新啟動mysql。

登入mysql:

[[email protected] mysql]# mysql -uroot -p  //預設密碼空,直接敲回車進入

mysql>change master to 

       ->master_host=‘192.168.1.109‘,  //master伺服器ip

   ->mastet_user=‘repl‘,  //使用者名稱

   ->mastet_password=‘123456‘,  //密碼

   ->master_log_file=‘mysql-bin.000001‘,  //master伺服器二進位制日誌名

   ->master_log_pos=107;

mysql>slave start;  //啟動slave

mysql> SHOW SLAVE STATUS\G;  //檢視slave狀態

*************************** 1. row ***************************

             Slave_IO_State:

                Master_Host: 192.168.1.109

                Master_User: repl

                Master_Port: 3306

              Connect_Retry: 60

            Master_Log_File: mysql-bin.000001

        Read_Master_Log_Pos: 4

             Relay_Log_File: mysql-relay-bin.000001

              Relay_Log_Pos: 4

      Relay_Master_Log_File: mysql-bin.000001

           Slave_IO_Running: yes

          Slave_SQL_Running: yes

                             ...omitted...

      Seconds_Behind_Master: NULL

如果 Slave_IO_Running和Slave_SQL_Running顯示為yes則配置ok,過程中可能會出現:

Slave I/O: error connecting to master ‘[email protected]:3306‘ - retry-time: 60  retries: 86400, Error_code: 2003

引起問題原因是防火牆攔截了,解決辦法就是修改防火牆配置,簡單直接的辦法就是把master伺服器的防火牆關掉,執行/etc/init.d/iptables stop命令。

接下來測試,在master中建立一個資料庫db_test,檢視slave中是是否存在db_test。

至此slave配置結束,其他從伺服器按此方式配置。

 

4、配置mysql-proxy,代理服務最好另外部署一臺機器,尤其是上線執行後,所以這裡測試也是用了單獨一臺虛擬機器,沒有部署在master或slave機器上。

 [[email protected] local]# tar -zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit.tar.gz  //解壓

 [[email protected] local]# ln -s  mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit  mysql-proxy  //加一個快捷連結

 [[email protected] local]# groupadd mysql-proxy  //建立使用者組

 [[email protected] local]# useradd -g mysql-proxy  mysql-proxy  //建立使用者

 [[email protected] local]# cd mysql-proxy  //進入mysql-proxy目錄

 [[email protected] mysql-proxy]# chown -R root:mysql-proxy .  //更改目錄屬主和屬組,命令後面有一個點(.)表示當前目錄

 [[email protected] mysql-proxy]# vi /etc/profile.d/mysql-proxy.sh  //把mysql的bin目錄加到PATH變數中,

 export PATH=$PATH:/usr/local/mysql-proxy/bin

 [[email protected] mysql-proxy]# source /etc/profile   //讓配置檔案立刻生效

 [[email protected] mysql-proxy]# mysql-proxy --help-all  //檢視mysql-proxy命令,出現如下資訊:

 bubuko.com,布布扣

下面我們啟動mysql-proxy,做一個簡單測試,不過我們先要簡單介紹一下mysql-proxy命令。

mysql-proxy 命令

  • --help-all ———— 用於獲取全部幫助資訊

  • --proxy-address=host:port ———— 代理服務監聽的地址和埠

  • --admin-address=host:port ———— 管理模組監聽的地址和埠

  • --proxy-backend-addresses=host:port ———— 後端mysql伺服器的地址和埠(主伺服器)

  • --proxy-read-only-backend-addresses=host:port ———— 後端只讀mysql伺服器的地址和埠(從伺服器

  • --proxy-lua-script=file ———— 完成mysql代理功能的Lua指令碼

  • --daemon ———— 以守護程序模式啟動mysql-proxy

  • --defaults-file=/path/to/conf_file_name ———— 預設使用的配置檔案路徑

  • --log-file=/path/to/log_file_name ———— 日誌檔名稱

  • --log-level=level ———— 日誌級別

  • --log-use-syslog ———— 基於syslog記錄日誌

  • --user=user_name ———— 執行mysql-proxy程序的使用者

[[email protected] mysql-proxy]# mysql-proxy  --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.1.109:3306" --proxy-read-only-backend-addresses="192.168.1.110:3306"  //啟動mysql-proxy [[email protected] mysql- proxy]# tail /var/log/mysql-proxy.log  //檢視啟動日誌

2014-05-10 00:09:22: (critical) plugin proxy 0.8.4 started
2014-05-10 00:09:22: (debug) max open file-descriptors = 1024
2014-05-10 00:09:22: (message) proxy listening on port :4040
2014-05-10 00:09:22: (message) added read/write backend: 192.168.1.109:3306
2014-05-10 00:09:22: (message) added read-only backend: 192.168.1.110:3306

[[email protected] mysql-proxy]#netstat -ntulp | grep :4040  //檢視監聽的埠

tcp        0      0 0.0.0.0:4040                0.0.0.0:*                   LISTEN      10056/mysql-proxy

現在我們需要在master伺服器中建立一個遠端登入的mysql賬號

master:

mysql> GRANT ALL ON *.* TO [email protected] ‘192.168.1.%‘  IDENTIFIED BY  ‘123456‘ Query OK, 0 rows affected (0.07 sec) mysql> FLUSH PRIVILEGES;  Query OK, 0 rows affected (0.04 sec)   在從 伺服器上做測試: slave: [[email protected] ~] mysql -uroot -p123456 -h192.168.1.112 --port=4040  bubuko.com,布布扣 這樣就連上了Mysql-Proxy伺服器了,如果出現錯誤:ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.1.112‘ (113),請修改防火牆配置或關閉。 下面我們來實現讀寫分離,Mysql-Proxy本身不會實現讀寫分離,主要是依靠 Lua 指令碼實現的。 [[email protected] mysql-proxy]# killall mysql-proxy  //殺掉mysql-proxy程序 [[email protected] mysql-proxy]# netstat -ntlup | grep 4040  //檢視程序是否停掉 [[email protected] mysql-proxy]# cd share/doc/mysql-proxy/  [[email protected] mysql-proxy]# ls | grep rw-splitting.lua  //檢視讀寫分離指令碼,lua語言實現 rw-splitting.lua [[email protected] mysql-proxy]# mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.1.109:3306" --proxy-read-only-backend-addresses="192.168.1.110:3306" --proxy-lua-script="/usr/local/ mysql-proxy/share/doc/mysql- proxy/rw-splitting.lua" [[email protected] mysql-proxy]#

在slave 伺服器上做測試,ok,完成了,mysql-proxy實現mysql叢集的讀寫分離完成了,這種模式是MySQL叢集最為基本的一種模式,也能夠實現負載均衡,後續研究MySQL更深層次的叢集,一同分享一同進步。^_^


轉載:http://www.bubuko.com/infodetail-174057.html