mysql集羣(一)

1、mysql cluster

    結構: sql + data + mgm節點node

    原理mysql

    集羣由3個概念redis

    1,sql節點  sql nodesql

    2,數據節點 data node數據庫

    3,管理節點 ndb managerment服務器

    sql語句發送sql節點sql節點發往數據節點,再由管理節點完成數據節點的之間的同步。網絡

    集羣技術相對複雜,至少有3種節點,4臺服務器才能完成。session

2、mysql replication

    結構: master + slavetcp

    一、主從複製

    master負責寫,slave負責讀,解決了數據庫瓶頸問題測試

    原理

    1,主服務器運行語句,都產生一個二進制日誌 binlog

    2,從服務器不斷讀取主服務器的binlog

    3,從主服務讀取到的binlog,轉換爲自身可執行的relaylog

    4,執行relaylog

    實現步驟

    1,首先確保主服務器打開二進制日誌功能

        主服務器一旦有數據變化,當即產生二進制日誌

    2,從服務器也須要開啓二進制日誌和relay日誌功能

        這樣能夠從主服務器讀取binlog,併產生relaylog

    3,在主服務器創建一個從服務器的帳號,並授予數得上權限

    4,指定從服務對應的主服務器,開啓從服務器

    具體實施

    虛擬機下有兩臺CentOS-6.7,IP爲192.168.1.67(master)和192.168.1.83(slave)

    1,67作主服務器

    2,83作從服務器

    3,保證主從3306端口互通

    4,配置主服務器,打開binlog

        

        #給服務器起一個惟一的id,一般以局域網ip最後段命名

        server-id=67

        #開啓二進制日誌

        log-bin=mysql-bin

        #指定日誌格式

        binlog-format=mixd

        注:binlog日誌格式選擇

            主服務器的日誌格式用哪一種好?

            有 statement,row,mixed 3種,其中mixed是指前2種的混合。

            一、insert into xxtable values (x,y,z)

                影響:1行,且爲新增1行,對於其餘行沒有影響。 

                這個狀況,用row格式,直接複製磁盤上1行的新增變化。

            二、update xxtable set age=21 where name='sss'

                這個狀況,通常也只是影響1行,用row也比較合適。

                以過年發紅包,全公司的人,都漲薪100元。

            三、update xxtable set salary=salary+100

                這個語句帶來的影響,是針對每一行的,所以磁盤上不少row都發生了變化。

                此處,適合就statment格式的日誌。

            2種日誌,各有各的高效的地方,mysql提供了mixed類型。

            能夠根據語句的不一樣,而自動選擇適合的日誌格式。

        重啓mysql

        

        已經可以充當master服務器

    5,配置從服務器打開binlog和relaylog

        

        #給服務器起一個惟一的id,一般以局域網ip最後段命名

        server-id=83

        #開啓二進制日誌

        log-bin=mysql-bin

        #指定日誌格式

        binlog-format=mixd

        #從服務器中繼日誌

        relay-log=mysql-relay

        #指定只讀

        read-only=1

        重啓從服務器

    6,在服務器上建立相應的複製帳號

        GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

        刷新權限

        flush privileges;

    7,在服務器經過語句指定要複製的主服務器(注意,能夠一主多從,不可一從多主)

        CHANGE MASTER TO \
MASTER_HOST='192.168.1.67',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000015',
MASTER_LOG_POS=3069;

    8,啓動服務器功能

        start slave;

        注:經常使用語句

            show master status ; 查看master的狀態, 尤爲是當前的日誌及位置

            show slave stattus; 查看slave的狀態.

            reset slave ;  重置slave狀態.

            start slave ; 啓動slave 狀態(開始監聽msater的變化)

            stop slave; 暫停slave狀態;

        配置錯誤展現

        

        錯誤分析

            一、網絡不通
            二、密碼不對
            三、pos不對

        解決方法:

            主服務器防火牆3306端口設置對外訪問

            /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

            /etc/rc.d/init.d/iptables save

            /etc/init.d/iptables restart

            /etc/init.d/iptables status

        配置完成

        

    9,測試

        CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

        CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT '' COMMENT 'name',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

        INSERT INTO test (name) VALUES ('安大廈');

        mysql二進制日誌

            /usr/local/mysql/var/

        查看最新的bin-log日誌

            more mysql-bin.index

        查看master使用的bin-log日誌

            show master status

    二、主主複製

        互爲主從,解決讀數據庫寫壓力,不至於一臺master宕機,網站不能訪問,缺點 同步衝突

        大體思路:

            1,2臺服務器都設置上2進制日誌和relay日誌

            2,都設置上replcation帳號

            3,都設置對方爲本身的master

        具體實施:

            虛擬機下有兩臺CentOS-6.7,IP爲192.168.1.67和192.168.1.83

            1,配置67服務器,配置binlog和relaylog

                #給服務器起一個惟一的id,一般以局域網ip最後段命名

                server-id=67

                #開啓二進制日誌

                log-bin=mysql-bin

                #指定日誌格式

                binlog-format=mixd

               重啓mysql

                

               67服務器上建立相應的複製帳號                

                GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

                在67服務器經過語句指定要複製的83服務器

                CHANGE MASTER TO \
MASTER_HOST='192.168.1.83',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000016',
MASTER_LOG_POS=1720;

                刷新權限

                flush privileges;

                start slave;

            2,配置83服務器,配置binlog和relaylog

                #給服務器起一個惟一的id,一般以局域網ip最後段命名

                server-id=83

                #開啓二進制日誌

                log-bin=mysql-bin

                #指定日誌格式

                binlog-format=mixd

                

                在83服務器上建立相應的複製帳號                

                GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

                在83服務器經過語句指定要複製的67服務器

                CHANGE MASTER TO \
MASTER_HOST='192.168.1.67',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000017',
MASTER_LOG_POS=411;

                刷新權限

                flush privileges;

                start slave;

        主主複製下必定要注意避免的問題---------同步衝突

        2臺mysql地位相等, 假如2個請求同時到達2臺服務器,

            請求的A節點,  stu 的id爲1

            請求的B 節點,  stu的id爲1 ,

        同步--->衝突

        如何解決?

            讓master1  1,3,5,7來增加

            另master2  2,4,6,8來增加

           master1:

set global auto_increment_increment = 2;#每步增加2

set global auto_increment_offset = 1;#從1開始增加

set session auto_increment_increment = 2;

set session auto_increment_offset = 1;

        注:global全局,session當次鏈接

            master2:

set global auto_increment_increment = 2;

set global auto_increment_offset = 2;

set session auto_increment_increment=2;

set session auto_increment_offset = 2;

        注:auto-increment-increment 和 auto-increment-offset 要寫到配置文件 my.cnf 中,防止下次重啓後失效。

         master1的my.cnf加入   

            auto_increment_increment=2  

            auto_increment_offset=1

        master2的my.cnf加入

            auto_increment_increment=2  

            auto_increment_offset=2

        查詢默認auto_increment_increment 和 auto_increment_offset

        SHOW VARIABLES LIKE '%auto_inc%';

        操做後獲得以下相似效果

        

        若是後期須要加服務器,這個辦法就有限制了。

        咱們能夠在業務邏輯上來解決,

        好比在racle 有sequnce,序列。

        序列每次訪問,生成遞增/遞減的數據。

        以redis爲例,咱們能夠專門構建一個 global:userid

        每次PHP插入Mysql前,先 incr->global:userid,獲得一個不重複的userid。

    三、被動主主複製

        避免了主主複製的缺點只是一臺服務器寫入,另外一臺讀取備份

          是指 2臺服務器地位同樣,但其中一臺爲只讀,而且業務中也只寫某1臺服務器。

          好處: 若是供寫入的服務器出了故障,能迅速的切換到從服務器,

              或者出於檢修等目的,把寫入功能切換到另外一臺服務器也比較方便。

相關文章
相關標籤/搜索