MySQL主从仿制原理、主从仿制(异步)、半同步仿制、根据SSL仿制51CTO博客 - 牛牛娱乐

MySQL主从仿制原理、主从仿制(异步)、半同步仿制、根据SSL仿制51CTO博客

2019-01-03 13:10:14 | 作者: 千凡 | 标签: 仿制,主从,同步 | 浏览: 1074

概述

    仿制一般用来创立主节点的副本,经过增加冗余节点来确保高可用性,当然仿制也能够用于其他 用处,例如在从节点进步行数据读、剖析等等。在横向扩展的业务中,仿制很简单施行,首要体现在在运用主节点进行写操作,多个从节点进行读操作,在mysql5.5中默以为异步仿制。

    mysql 仿制的异步性是指:事物首要在主节点上提交,然后仿制给从节点并在从节点上运用,这样意味着在同一个时刻点主从上的数据或许不共同,异步仿制的优点在于它 比同步仿制要快,假如对数据的共同性要求很高,仍是选用同步仿制较好。

    mysql-5.5 开端支撑semi-synchronous的仿制,也叫半同步仿制,意图在于业务环境下坚持主从共同

    mysql-5.6 开端支撑延时仿制。

    mysql仿制的原理现阶段都是相同的,master将操作记载到bin-log中,slave的一个线程去master读取bin-log,并将他们保存到relay-log中,slave的别的一个线程去重放relay-log中的操作来完结和master数据同步。


    

    该进程的榜首部分便是master记载二进制日志。在每个业务更新数据完结之前,master在二日志记载这些改动。MySQL将业务串行的写入二进制日志,即便业务中的句子都是穿插履行的。在事情写入二进制日志完结后,master告诉存储引擎提交业务。
    下一步便是slave将master的binary log拷贝到它自己的中继日志。首要,slave开端一个作业线程——I/O线程。I/O线程在master上翻开一个一般的衔接,然后开端binlog dump process。Binlog dump process从master的二进制日志中读取事情,假如现已跟上master,它会睡觉并等候master发生新的事情。I/O线程将这些事情写入中 继日志。
    SQL slave thread(SQL从线程)处理该进程的最终一步。SQL线程从中继日志读取事情,并重放其间的事情而更新slave的数据,使其与master中的数 据共同。只需该线程与I/O线程坚持共同,中继日志一般会坐落OS的缓存中,所以中继日志的开支很小。
    此外,在master中也有一个作业线程:和其它MySQL的衔接相同,slave在master中翻开一个衔接也会使得master开端一个线程。仿制 进程有一个很重要的约束——仿制在slave上是串行化的,也便是说master上的并行更新操作不能在slave上并行操作。


异步主从仿制装备

预备:

    OS:rhel5.8_i386

    SoftWare: mysql-5.5.28-linux2.6-i686.tar.gz


1、主从装置mysql

   tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/
   # cd /usr/local/
   # ln -s mysql-5.5.28-linux2.6-i686/ mysql
   # groupadd -r mysql
   # useradd -r -g mysql -s /sbin/nologin mysql
   # mkdir /mydata/data -p
   # chown -R mysql.mysql /mydata/data/
   # chown -R root.mysql /usr/local/mysql/*
   # cp support-files/my-large.cnf /etc/my.cnf
   # cp support-files/mysql.server  /etc/init.d/mysqld
       [mysqld]
       innodb_file_per_table = 1
       datadir = /mydata/data #由所以二进制装置的mysql所以有必要指定数据库目录方位
   # vim /etc/profile.d/mysqld.sh
       export PAHT=$PATH:/usr/local/mysql/bin
   # . /etc/profile.d/mysqld.sh

2、主服务器装备

    # vim /etc/my.cnf
        [mysqld]
        log-bin = master-bin
        log-bin-index = master-bin.index
        
        server-id = 1
    # scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
    # service mysqld start
    # mysql
    mysql> grant replication slave on *.* to repl@192.168.100.12 identified by asdasd;
    mysql> flush privileges;
    mysql> flush logs;
    mysql> show master logs;
    +-------------------+-----------+
    | Log_name          | File_size |
    +-------------------+-----------+
    | master-bin.000001 |     27326 |
    | master-bin.000002 |   1038693 |
    | master-bin.000003 |       379 |
    | master-bin.000004 |       107 |
    +-------------------+-----------+
    mysql> purge binary logs to master-bin.000004;

3、从服务器装备

    # vim /etc/my.cnf
        [mysqld]
        relay-log = relay-log
        relay-log-index = relay-log.index
        read-only = 1
        #innodb_file_per_table = 1
        #binlog_format=mixed
        server-id = 10
    # scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
    # service mysqld start
    mysql> change master to master_host=192.168.100.11,master_user=repl,master_password=asdasd,master_log_file=master-bin.000004,master_log_pos=107;
    mysql> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 192.168.100.11
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: master-bin.000004
              Read_Master_Log_Pos: 107
                   Relay_Log_File: relay-log.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: master-bin.000004
                 Slave_IO_Running: No
                Slave_SQL_Running: No
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 107
                  Relay_Log_Space: 107
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: NULL
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 0
    1 row in set (0.00 sec)
    mysql> start slave;
    mysql> show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ..............

    至此主从异步仿制就完结了

    阐明:

        slave_id 有必要是仅有的

        slave没有必要敞开二进制日志,但在有些情况下有必要设置,如mysql级联. slave为其它slave的master,所以要设置bin_log,默以为hostname,但假如hostname改动则会出问题。

        有些人或许敞开了slave二进制日志,却没有设置log_slave_updates,然后检查slave的数据是否改动,这是过错的装备。所以尽量运用read_only = 1 ,避免改动数据(除了sql_thread进程)。

        start slave :发动从服务器IO_Thread和SQL_Thread线程,这儿也能够独自对它们进行发动

        在主服务器上需设置sync-binlog = 1 ,用于业务安全

        重置change master参数:

            mysql> slave stop;
            mysql> reset slave;
            mysql> change master to master_host=192.168.100.11,master_user=repl,master_password=asdasd,master_log_file=master-bin.000005,master_log_pos=107;

        因为slave都会主动衔接上master,当咱们有时需求手动调整时能够在发动前移动slave数据目录下的master.ino和relay.info文件,或许检查variables中有无“skip-slave-start”变量,有就设置为ON



半同步仿制

    /usr/local/mysql/lib/plugin/semisync_master.so
    /usr/local/mysql/lib/plugin/semisync_slave.so

    1、主服务器装备

    mysql> install plugin rpl_semi_sync_master soname semisync_master.so;
    mysql> show variables like %semi%;
    +------------------------------------+-------+
    | Variable_name                      | Value |
    +------------------------------------+-------+
    | rpl_semi_sync_master_enabled       | OFF   |
    | rpl_semi_sync_master_timeout       | 10000 |
    | rpl_semi_sync_master_trace_level   | 32    |
    | rpl_semi_sync_master_wait_no_slave | ON    |
    +------------------------------------+-------+
    mysql> set global rpl_semi_sync_master_enabled=1;
    mysql> set global rpl_semi_sync_master_timeout=1000;

    2、Slave上装备

    mysql> install plugin rpl_semi_sync_slave soname semisync_slave.so;
    mysql> show variables like %semi%;
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | OFF   |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    mysql> set global rpl_semi_sync_slave_enabled=1;

    假如需求永久收效,请将上面几个变量别离写入master与slave中mysqld字段中。


MySQL仿制过滤

    MySQL仿制过滤能够在Master,也能够在Slave
    因为根据Master的过滤操作为影响到二进制日志的完整性,关于咱们今后做及时点复原会有影响,所以咱们一般不主张在Maser上做仿制过滤。

    1、根据数据库

    binlog-do-db           //binlog-do-db表明和哪个数据库相关的写入类、修正类指令会被写入
    binlog-ignore-db        //binlog-ignore-db表明疏忽(黑名单)


    2、根据表
    replicate-do-table=
    replicate-ignore-table=


    3、关于表,还能够用通配符装备过滤
    replicate-wild-do-table=
    replicate-wild-ignore-table=





SSL仿制

    要求主从服务器各自都要有证书和私钥;默许情况下主从服务器的SSL功用是没有启用的,需求先启用。

    mysql> show variables like %ssl%;
    +---------------+----------+
    | Variable_name | Value    |
    +---------------+----------+
    | have_openssl  | DISABLED |
    | have_ssl      | DISABLED |
    | ssl_ca        |          |
    | ssl_capath    |          |
    | ssl_cert      |          |
    | ssl_cipher    |          |
    | ssl_key       |          |
    +---------------+----------+

1、装备Master为CA证书服务器

# vim /etc/pki/tls/openssl.cnf
# cd /etc/pki/CA/
# (umask 077; openssl genrsa 1024 >private/cakey.pem)
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
    Country Name (2 letter code) [GB]:CN 
    State or Province Name (full name) [Berkshire]:GD
    Locality Name (eg, city) [Newbury]:ZS
    Organization Name (eg, company) [My Company Ltd]:NEO
    Organizational Unit Name (eg, section) []:tech
    Common Name (eg, your name or your servers hostname) []:station01.neo.com
# mkdir newcerts certs crl
# touch index.txt
# echo 01 >serial

2、为Master上的MySQL预备私钥以及颁布证书

# mkdir /usr/local/mysql/ssl
# cd /usr/local/mysql/ssl/
#(umask 077; openssl genrsa 1024 > mysql.key)
# openssl req -new -key mysql.key -out mysql.csr -days 3650
    Country Name (2 letter code) [GB]:CN
    State or Province Name (full name) [Berkshire]:GD
    Locality Name (eg, city) [Newbury]:ZS
    Organization Name (eg, company) [My Company Ltd]:NEO
    Organizational Unit Name (eg, section) []:tech
    Common Name (eg, your name or your servers hostname) []:station01.neo.com
    Email Address []:
    
    Please enter the following extra attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
# openssl ca -in mysql.csr -out mysql.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: May 28 02:26:17 2014 GMT
            Not After : May 28 02:26:17 2015 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = GD
            organizationName          = NEO
            organizationalUnitName    = tech
            commonName                = station01.neo.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                A4:B7:A6:98:9F:60:08:BE:86:87:65:5F:B6:13:BC:4A:5B:D4:44:3A
            X509v3 Authority Key Identifier: 
                keyid:4F:D8:57:42:D9:39:17:7D:39:44:91:01:A4:01:DE:32:92:D6:F9:DF

Certificate is to be certified until May 28 02:26:17 2015 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# chown mysql.mysql *

3、Slave上请求证书

# mkdir /usr/local/mysql/ssl
# (umask 077; openssl genrsa 1024 >mysql.key)
# openssl req -new -key mysql.key -out mysql.csr -days 3650
    Country Name (2 letter code) [GB]:CN
    State or Province Name (full name) [Berkshire]:GD
    Locality Name (eg, city) [Newbury]:ZS
    Organization Name (eg, company) [My Company Ltd]:NEO
    Organizational Unit Name (eg, section) []:tech
    Common Name (eg, your name or your servers hostname) []:station02.neo.com
    Email Address []:
    
    Please enter the following extra attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
# scp mysql.csr 192.168.100.11:/root/

4、Master上为Slave签发证书

# openssl ca -in mysql.csr -out mysql.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: May 28 02:36:24 2014 GMT
            Not After : May 28 02:36:24 2015 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = GD
            organizationName          = NEO
            organizationalUnitName    = tech
            commonName                = station02.neo.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                81:9F:5B:E7:06:D0:64:B7:E6:81:3F:98:95:71:D4:DF:C6:B8:CE:3D
            X509v3 Authority Key Identifier: 
                keyid:4F:D8:57:42:D9:39:17:7D:39:44:91:01:A4:01:DE:32:92:D6:F9:DF

Certificate is to be certified until May 28 02:36:24 2015 GMT (365 days)
Sign the certificate? [y/n]:yes


1 out of 1 certificate requests certified, commit? [y/n]yes
Write out database with 1 new entries
Data Base Updated
# scp mysql.crt 192.168.100.12:/usr/local/mysql/ssl/
# scp /etc/pki/CA/cacert.pem 192.168.100.12:/usr/local/mysql/ssl/


5、Master上编缉/etc/my.cnf启用ssl,并设置主从


# vim /etc/my.cnf
[mysqld] 
log-bin=mysql-bin 
sync_binlog = 1                          ##二进制日志 
server-id = 1                            ##此id有必要大局仅有 
innodb_flush_log_at_trx_commit=1         ##每秒将业务日志马上刷写到磁盘 
ssl                                      ##启用ssl默许是不敞开的,mysql中show variables like %ssl%检查 
ssl_ca =/usr/local/mysql/ssl/cacert.pem      ##ca文件的方位 
ssl_cert= /usr/local/mysql/ssl/mysql.crt     ##证书文件的方位 
ssl_key = /usr/local/mysql/ssl/mysql.key     ##私钥文件的方位







6、发动mysql,并检查ssl信息

# service mysqld start 
# mysql 
mysql> show variables like %ssl%; 
+---------------+---------------------------------+ 
| Variable_name | Value                           | 
+---------------+---------------------------------+ 
| have_openssl  | YES                             | 
| have_ssl      | YES                             | 
| ssl_ca        | /usr/local/mysql/ssl/cacert.pem | 
| ssl_capath    |                                 | 
| ssl_cert      | /usr/local/mysql/ssl/mysql.crt  | 
| ssl_cipher    |                                 | 
| ssl_key       | /usr/local/mysql/ssl/mysql.key  | 
+---------------+---------------------------------+



7、为同步树立一最小权限账户,并要求ssl

mysql> create user backup_ssl@192.168.100.12 identified by redhat; 
mysql> revoke all privileges,grant option from backup_ssl@192.168.100.12; 
mysql> grant replication slave,replication client on *.* to backup_ssl@192.168.100.12 require ssl; 
mysql> flush privileges;
mysql> flush logs;


8、Slave上编缉/etc/my.cnf,启用ssl,并设置主从

# vim /etc/my.cnf
[mysqld] 
server-id = 2                        ##此id有必要大局仅有 
##log-bin = mysql-bin                ##注释掉,从服务器不需求二进制日志
relay-log = mysql-relay              ##中继日志 
relay-log-index = mysql-ralay.index  ##中继目录 
read-only = 1                        ##从服务器只读
ssl                                  ##启用ssl默许是不敞开的,mysql中show variables like %ssl%检查 
ssl_ca =/usr/local/mysql/ssl/cacert.pem  ##ca文件的方位 
ssl_cert= /usr/local/mysql/ssl/mysql.crt ##证书文件的方位 
ssl_key = /usr/local/mysql/ssl/mysql.key ##私钥文件的方位



   


9、启用mysqld并检查ssl相关信息

# servie mysqld start 
mysql> show variables like %ssl%; 
+---------------+---------------------------------+ 
| Variable_name | Value                           | 
+---------------+---------------------------------+ 
| have_openssl  | YES                             | 
| have_ssl      | YES                             | 
| ssl_ca        | /usr/local/mysql/ssl/cacert.pem | 
| ssl_capath    |                                 | 
| ssl_cert      | /usr/local/mysql/ssl/mysql.crt  | 
| ssl_cipher    |                                 | 
| ssl_key       | /usr/local/mysql/ssl/mysql.key  | 
+---------------+---------------------------------+

10、发动slave同步进程,衔接主服务器

mysql> change master to  
    -> master_host=192.168.100.11, 
    -> master_user=backup_ssl, 
    -> master_password=redhat, 
    -> master_log_file=mysql-bin.000004, 
    -> master_ssl=1, 
    -> master_ssl_ca=/usr/local/mysql/ssl/cacert.pem, 
    -> master_ssl_cert=/usr/local/mysql/ssl/mysql.crt, 
    -> master_ssl_key=/usr/local/mysql/ssl/mysql.key; 
mysql> start slave 
mysql> show slave status\G; ##检查slave状况



   


11、重视以下参数:

Slave_IO_Running: Yes                                  ##IOthread是否运转,假如为No代表slave运转不正常 
Slave_SQL_Running: Yes                                 ##SQLthread是否运转,假如为No代表slave运转不正常 
Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem    ##是否启用了ssl 
Master_SSL_Cert: /usr/local/mysql/ssl/mysql.crt 
Master_SSL_Key: /usr/local/mysql/ssl/mysql.key 
Master_Log_File: mysql-bin.00005                       ##最终接纳的主服务器的二进制 
Exec_Master_Log_Pos: 338                               ##最终履行的方位,检查master中是不是该方位 
Last_IO_Errno: 0                                       ##最终一次IOthread有没有报错



版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章