mysql (ab複製 mysql中間件)

原理圖:mysql

mysql ab複製linux

A->B
master:
    vim /etc/my.cnf
    添加
    log-bin=mysql-bin
    server_id=1
    show master status
    grant replication slave on *.* to repl@'%' identified by 'repl'
    mysql-bin.000001 position 111
重啓mysql服務器sql

slave:
    vim /etc/my.cnf
    log-bin=mysql-bin
    server_id=2vim

重啓mysql服務器
    CHANGE MASTER TO
      MASTER_HOST='mysql-master-host',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl',
      MASTER_PORT=3306,
      MASTER_LOG_FILE='當前二進制日誌文件',
      MASTER_LOG_POS=position,
      MASTER_CONNECT_RETRY=10;後端

A->B OK
A<->B ?
A->B->C ?
A->B->C->A ?服務器


A->B
User1---insert--->A----->B
User1---insert--->B------>??????
ab複製
單向複製tcp

A<->B
User1---insert--->A----->B
User2---insert--->B----->A
疑問若是兩個用戶都DML同一條記錄,那應該是A->B,仍是B->A????
雙向複製ide

A->B->C
A->B
A->C
支持一主多從ui

A->B
C->B
不支持多主一從lua


對於已有數據的mysql服務器作ab複製
1.全庫備份 --master-data=2 mysql-bin.xxxx position xxx2.從庫導入主庫備份
3.change master to mysql-bin.xxxx position xxx

問題:始終會浪費服務器

解決:告知應用DML操做連接主mysql,select操做連接從mysql
      讀寫分離
          mysql-proxy
          Amoeba
      mysql集羣
          mysql-cluster
      
          MMM
      
          mysql ab雙向複製 + keepalived
      grant replication slave on *.* to repl@'%' identified by 'repl';


總結:
    前提:
       ab複製的mysql server版本必須一致
       主必須開啓二進制日誌
    步湊:
        master:
            /etc/my.cnf
            log-bin=mysql-bin 開啓二進制日誌
            server_id=1設置服務器ID
            mysql>grant replication slave on *.* to repl@'%' identified by 'repl';
            mysql>show master status;
        記住修改配置文件以後要重啓mysql

        slave:
            /etc/my.cnf
            log-bin=mysql-bin開啓二進制日誌
            server_id=2設置服務器ID
        記住修改配置文件以後要重啓mysql
            mysql>CHANGE MASTER TO
                   MASTER_HOST='mysql-master-host',master主機地址
                   MASTER_USER='repl',受權複製的用戶
                   MASTER_PASSWORD='repl',密碼
                   MASTER_PORT=3306,master端口
                   MASTER_LOG_FILE='mysql-bin.00001',當前二進制日誌文件
                   MASTER_LOG_POS=111,從那個position開始
                   MASTER_CONNECT_RETRY=10;重試次數
            mysql>start slave;
            mysql>show slave status\G;
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            以上兩個出現yes就算是完成ab複製的功能

            驗證:
                可在主庫上建立庫,在從庫上看是否有這個庫生成


mysql-proxy 是一個mysql代理程序,主要目的實現mysql的讀寫分離
是經過lua腳原本實現
軟件版本:mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
這是一個通用的二進制安裝包
1.解壓,安裝
    tar -xvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
    mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
    chown root.root /usr/local/mysql-proxy -R
    useradd mysql-proxy -s /sbin/nologin

2.設置
    2.1因爲二進制包中沒有提供啓動腳本因此須要自行編寫啓動,我這裏已經爲你們提供了一個啓動腳本(啓動腳本名稱:mysql-proxy)
    2.2修改lua腳本
        vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
        min_idle_connections = 1,
        max_idle_connections = 1,
    2.3添加mysql-proxy的配置文件
        vim /etc/sysconfig/mysql-proxy
        ADMIN_USER="admin"
        ADMIN_PASSWORD="admin"
        ADMIN_ADDRESS=""
        ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
        PROXY_ADDRESS=""
        PROXY_USER="mysql-proxy"
        PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.242.134:3306 --proxy-read-only-backend-addresses=192.168.242.135:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

#//--daemon:以守護進程模式啓動mysql-proxy
#//--proxy-backend-addresses:後端可讀寫的mysql服務器的地址和端口
#//--proxy-read-only-backend-addresses:後端只讀mysql服務器的地址和端口
#//--proxy-lua-script:完成mysql代理功能的Lua腳本

    2.4啓動mysql-proxy
        /etc/init.d/mysql-proxy start
        netstat -anutlp|grep mysql


    2.5驗證
        因爲須要在mysql-prxoy上面登陸mysql服務器因此須要安裝一個mysql客戶端,若是你不在proxy上登陸,那麼mysql-proxy服務器連mysql客戶端都不準要安裝

        在master上面建立一個用戶
        grant all on *.* to 'jack'@'%' identified by '123456'
        flush privileges

        登陸mysql-proxy的管理端
        mysql -uadmin -padmin -h mysql-proxy-ip --prot 4041
        這裏的用戶名和密碼是啓動腳本中設置的用戶名和密碼並不是mysql master所受權的用戶
        登陸mysql真實提供功能的服務器
        mysql -ujack -p123456 -h mysql-proxy-ip --port 3306
        
        而後在master上使用tcpdump抓包分析
        tcpdump -i eth0 -nn -XX ip dst mysql-master-ip and tcp dst port 3306

        在從服務器上也使用tcpdump抓包分析
        tcpdump -i eth0 -nn -XX ip dst mysql-slave-ip and tcp dst port 3306

        mysql -ujack -p123456 -h mysql-proxy-ip --port 3306
        create database db_name能夠看到數據在master上抓包了
        select * from up01;能夠看到數據在slave上抓包了

 

        若是沒有實現,請多開幾個mysql-proxy的鏈接會話
        並多執行幾回select語句

        能夠在mysql-proxy的管理端上使用         select * from backends去查看後端相應信息         +-------------+----------------------+-------+------+------+-------------------+         | backend_ndx | address              | state | type | uuid | connected_clients |         +-------------+----------------------+-------+------+------+-------------------+         |           1 | 192.168.242.134:3306 | up    | rw   | NULL |                 0 |         |           2 | 192.168.242.135:3306 | up    | ro   | NULL |                 0 |         +-------------+----------------------+-------+------+------+-------------------+         2 rows in set (0.00 sec)         若是不想寫啓動腳本就要用如下命令和參數去啓動        /usr/local/mysql-proxy/libexec/mysql-proxy --daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.242.134:3306 --proxy-read-only-backend-addresses=192.168.242.135:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --pid-file=/var/run/mysql-proxy.pid --proxy-address= --user=mysql-proxy --admin-username=admin --admin-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua --admin-password=admin

相關文章
相關標籤/搜索