mysql 讀寫分離筆記

環境:
mysqlmaster:192.168.1.94
mysqlslave:192.168.1.95
mysql-proxy:192.168.1.91
拓撲圖以下:
所需軟件:
yum -y install gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*    libevent* glib*
wget http://www.lua.org/ftp/lua-5.1.4.tar.gz

wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz    ##此包爲編譯好的二進制包
wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1.tar.gz
 
 

在創建讀寫分離以前須要配置mysql的主從複製。
步驟:
1.mysqlmaster端,編輯my.cnf 加入如下幾行
 
server-id=1         #這裏的ID必定要惟一
log-bin=mysql-bin    #開啓binlog
#binlog-do-db=data     #這行我註釋了,若是要是去掉註釋,則指定同步那一個庫
binlog-ignore-db=mysql #mysql庫不須要同步
log-slave-updates
 
進入mysql執行受權:
mysql> GRANT REPLICATION SLAVE ON *.* to rep1@'%' identified by 'www';
mysql> show master status;
+------------------+----------+--------------+------------------+
| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |            514 |                            | mysql                        |
+------------------+----------+--------------+------------------+
 
記錄File,Position
2.mysqlslave端,編輯my.cnf加入如下幾行:
server-id=2
log-bin=mysql-bin
master-host=192.168.1.94
master-user=rep1
master-password=www
master-port=3306
master-connect-retry=60
replicate-ignore-db=mysql
#replicate-do-db=data
log-slave-update
 
啓動slave
mysql> change master to master_host='192.168.1.94' ,master_user='rep1',master_password='www',master_log_file='mysql-bin.000005',master_log_pos=514;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
                         Slave_IO_State: Waiting for master to send event
                                Master_Host: 192.168.1.94
                                Master_User: rep1
                                Master_Port: 3306
                            Connect_Retry: 60
                        Master_Log_File: mysql-bin.000005
                Read_Master_Log_Pos: 514
                         Relay_Log_File: mysqld-relay-bin.000002
                            Relay_Log_Pos: 235
            Relay_Master_Log_File: mysql-bin.000005
                     Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
                        Replicate_Do_DB:
                Replicate_Ignore_DB: mysql

3.驗證效果在mysqlmaster創建一個庫,看mysqlslave是否同步過去。

mysql讀寫分離配置:
1.安裝lua
tar zvfx lua-5.1.4.tar.gz
cd lua-5.1.4

vim src/Makefile

將CFLAGS= -O2 -Wall $(MYCFLAGS)
改成
CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS)
cd src
make linux
cd ..
make install
cp etc/lua.pc    /usr/lib/pkgconfig/
vim    /etc/profile
在最後加入
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig
執行
source /etc/profile
 

2.安裝mysql-proxy
tar xzvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
mv mysql-proxy-0.8.1-linux-rhel5-x86-32bit /usr/local/mysql-proxy/
 
創建mysql-proxy啓動腳本
vim /etc/init.d/mysql-proxy
#!/bin/sh
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon to mysql

# Source function library.
. /etc/rc.d/init.d/functions

PROXY_PATH=/usr/local/mysql-proxy/bin


prog="mysql-proxy"

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Set default mysql-proxy configuration.
#PROXY_OPTIONS="--daemon"
PROXY_OPTIONS="--admin-username=root --admin-password=www --proxy-read-only-backend-addresses=192.168.1.95:3306 --proxy-backend-addresses=192.168.1.94:3306    --admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua    --proxy-lua-script=/usr/local/mysql-proxy/scripts/rw-splitting.lua"
PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid

# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
                . /etc/sysconfig/mysql-proxy
fi

PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH

# By default it's all good
RETVAL=0

# See how we were called.
case "$1" in
    start)
                # Start daemon.
                echo -n $"Starting $prog: "
                $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql --log-level=warning --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
                RETVAL=$?
                echo
                if [ $RETVAL = 0 ]; then
                                touch /var/lock/subsys/mysql-proxy
                fi
             ;;
    stop)
                # Stop daemons.
                echo -n $"Stopping $prog: "
                killproc $prog
                RETVAL=$?
                echo
                if [ $RETVAL = 0 ]; then
                                rm -f /var/lock/subsys/mysql-proxy
                                rm -f $PROXY_PID
                fi
             ;;
    restart)
                $0 stop
                sleep 3
                $0 start
             ;;
    condrestart)
             [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
            ;;
    status)
                status mysql-proxy
                RETVAL=$?
             ;;
    *)
                echo "Usage: $0 {start|stop|restart|status|condrestart}"
                RETVAL=1
             ;;
esac

exit $RETVAL

 
註釋:
PROXY_PATH=/usr/local/mysql-proxy/bin    //定義mysql-proxy服務二進制文件路徑

PROXY_OPTIONS="--admin-username=root \ //定義內部管理服務器帳號
--admin-password=password \ //定義內部管理服務器密碼
--proxy-read-only-backend-addresses=192.168.1.95:3306 \ //定義後端只讀從服務器地址    
--proxy-backend-addresses=192.168.1.94:3306 \ //定義後端主服務器地址
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua    \ //定義lua管理腳本路徑
--proxy-lua-script= /usr/local/mysql-proxy/scripts/rw-splitting.lua" \ //定義lua讀寫分離腳本路徑

PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid //定義mysql-proxy PID文件路徑

$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS \
--daemon \ //定義以守護進程模式啓動
--keepalive \ //使進程在異常關閉後可以自動恢復
--pid-file=$PROXY_PID \ //定義mysql-proxy PID文件路徑
--user=mysql \ //以mysql用戶身份啓動服務
--log-level=warning \ //定義log日誌級別,由高到低分別有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/log/mysql-proxy.log //定義log日誌文件路徑
 

 
mkdir    /usr/local/mysql-proxy/run    
mkdir /usr/local/mysql-proxy/log
chmod +x /etc/init.d/mysql-proxy
tar xzvf mysql-proxy-0.8.1.tar.gz
cd mysql-proxy-0.8.1
cp lib/rw-splitting.lua /usr/local/mysql-proxy/scripts
vim /usr/local/mysql-proxy/script/rw-splitting.lua
改成:
min_idle_connections = 1, //默認爲4
max_idle_connections = 1, //默認爲8
 
而後啓動:
service mysql-proxy start
而後
netstat -lntp
會看到:
tcp        0      0 0.0.0.0:4040                0.0.0.0:*                   LISTEN      22961/mysql-proxy
tcp        0      0 0.0.0.0:4041                0.0.0.0:*                   LISTEN      22961/mysql-proxy

3.測試效果:
mysql -uroot -ppassword -h 192.168.1.91 -P 4041
mysql> SELECT * FROM backends;
+-------------+-------------------+-------+------+------+-------------------+
| backend_ndx | address                     | state | type | uuid | connected_clients |
+-------------+-------------------+-------+------+------+-------------------+
|                     1 | 192.168.1.94:3306 | up        | rw     | NULL |                                 0 |
|                     2 | 192.168.1.95:3306 | up        | ro     | NULL |                                 0 |
+-------------+-------------------+-------+------+------+-------------------+
 
進入mysqlslave,關閉同步進程
mysql>stop slave;
登錄mysql-proxy
mysql -uroot -ppassword -h 192.168.1.91 -P 4040
mysql> use datatest
Database changed
mysql> select * from proxy;
+------+-------+
| id     | name    |
+------+-------+
|        3 | first |
|        4 | first |
|        6 | first |
|        7 | first |
+------+-------+
4 rows in set (0.00 sec)

mysql>    insert into proxy values(88,'second');
mysql> select * from proxy;
+------+-------+
| id     | name    |
+------+-------+
|        3 | first |
|        4 | first |
|        6 | first |
|        7 | first |
+------+-------+
 
進入slave,查看
mysql> use datatest
mysql> select * from proxy;
+------+-------+
| id     | name    |
+------+-------+
|        3 | first |
|        4 | first |
|        6 | first |
|        7 | first |
+------+-------+
由此看來無數據,由於若是是讀操做,會讀取slave服務器的數據
mysql> select * from proxy; +------+--------+ | id     | name     | +------+--------+ |        3 | first    | |        4 | first    | |        6 | first    | |        7 | first    | |     12 | first    | |     88 | second | +------+--------+
由此看來寫是正常的。 所以配置成功
相關文章
相關標籤/搜索