zoukankan      html  css  js  c++  java
  • Linux-MySQL5.6主从复制与读写分离

    主机

    操作系统

    IP地址

    主要软件

    Master

    Centos7.3x86_64

    192.168.1.101

    Cmake,Mysql

    Slave01

    Centos7.3x86_64

    192.168.1.102

    Cmake,Mysql

    Slave02

    Centos7.3x86_64

    192.168.1.103

    Cmake,Mysql

    Amoeba

    Centos7.3x86_64

    192.168.1.104

    Amoeba

    Client

    Centos7.3x86_64

    192.168.1.105

     

    实验环境:

    注:请提前配置好防火墙规则和本地yum源以及selinux

    主从复制:

    1         建立时间同步环境在master上面安装时间同步服务器

    1.1         安装NTP

    [root@master ~]# yum -y install ntp

    1.2         配置NTP

    [root@master ~]# vim /etc/ntp.conf      #添加如下两行

    server 127.127.1.0

    fudge 127.127.1.0stratum 8

    1.3         重启服务

    [root@master ~]# systemctl restart ntpd

    2         在从节点(slave01和都slave02都要同步)上面进行时间同步  

    [root@slave01 ~]# yum -y install ntpdate    #此处以slave01为例

    [root@slave01 ~]# ntpdate 192.168.1.101

    3         在Master,slave01和slave02上面编译安装Mysql

    3.1         编译安装(在三个节点安装的步骤相同,此处以master为例)

        [root@master ~]# cd opt

    [root@master opt]# yum install ncurses-devel -y

    [root@master opt]# tar xf cmake-2.8.6.tar.gz

    [root@master opt]# cd cmake-2.8.6

    [root@master cmake-2.8.6]# ./configure && gmake && gmake install

    [root@master cmake-2.8.6]# cd ..

    [root@master opt]# tar xf mysql-5.6.36.tar.gz

    [root@master opt]# cd mysql-5.6.36/

    [root@master mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make && make install

    3.2         优化调整

    [root@master mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf

    [root@master mysql-5.6.36]# cp support-files/mysql.server /etc/init.d/mysqld

    [root@master mysql-5.6.36]# chmod +x /etc/init.d/mysqld

    [root@master mysql-5.6.36]# chkconfig --add mysqld

    [root@master mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

    [root@master mysql-5.6.36]# . /etc/profile

    3.3         初始化数据库

    [root@master mysql-5.6.36]# groupadd mysql

    [root@master mysql-5.6.36]# useradd -M -s /sbin/nologin mysql -g mysql

    [root@master mysql-5.6.36]# chown -R mysql: /usr/local/mysql

    [root@master mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

    3.4         启动MySQL服务

    [root@master scripts]# systemctl start mysqld

    [root@master scripts]# chkconfig mysqld on

    [root@master scripts]# mysqladmin -uroot password 'pwd123' #修改root密码

    Warning: Using a password on the command line interface can be insecure.

    4         配置MySQL Master主服务器

    4.1         修改/etc/my.cnf文件,增加以下内容

    [root@master ~]# vim /etc/my.cnf

         server_id = 11

    log-bin = master-bin

    log-slave-updates = true

    4.2         重启MySQL服务

    [root@master etc]# systemctl restart mysqld

    4.3         登录MySQL程序,给服务器授权

    [root@master ~]# mysql -uroot -ppwd123

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'mysql'@'192.168.1.%' IDENTIFIED BY '123456';

    mysql> FLUSH PRIVILEGES;

    mysql> show master status;

    +-------------------+----------+--------------+------------------+-------------------+

    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

    +-------------------+----------+--------------+------------------+-------------------+

    | master-bin.000001 |      408 |              |                  |                   |

    +-------------------+----------+--------------+------------------+-------------------+

    1 row in set (0.00 sec)

    5         配置从服务器

    5.1         修改/etc/my.cnf增加以下内容:

    [root@slave01 ~]# vim /etc/my.cnf

    server_id = 22

    relay-log = relay-log-bin

    relay-log-index = slave-relay-bin.index

    5.2         重启服务

    [root@slave01 ~]# systemctl restart mysqld

    5.3         登录MySQL,配置同步

    [root@slave01 ~]# mysql -uroot -ppwd123

    mysql> change master to master_host='192.168.1.101',master_user='mysql',master_password='123456',master_log_file='master-bin.000001',master_log_pos=408;

    5.4         启动同步

    5.4.1    mysql> start slave;

    5.5         查看Slave状态,确保以下两个值为YES

    mysql> show slave statusG;

       Slave_IO_Running: Yes

       Slave_SQL_Running: Yes

    6         验证主从复制

    6.1         在主,从服务器上登录MySQL

    [root@master ~]# mysql -uroot -ppwd123

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |      

    | mysql              |

    | performance_schema |

    | test               |

    +--------------------+

    4 rows in set (0.00 sec)

    6.2         在主服务器上面新建db_test数据库

    mysql> create database db_test charset 'utf8';

    Query OK, 1 row affected (0.00 sec)

    6.3         在主从数据库上分别查看数据库,显示数据库相同,则主从复制成功

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |

    | db_test            |

    | mysql              |

    | performance_schema |

    | test               |

    +--------------------+

    5 rows in set (0.01 sec)

     

     

    读写分离:

    1         在Amoeba主机安装java环境

    因为Amoeba是基于jdk1.5开发的,所以官方推荐使用jdk1.5或jdk1.6,高版本不建议使用

    [root@amoeba ~]# mv jdk-1_5_0_21-linux-amd64.bin /usr/local/

    [root@amoeba ~]# cd /usr/local/

    [root@amoeba local]# chmod +x /usr/local/jdk-1_5_0_21-linux-amd64.bin

    [root@amoeba local]# ./jdk-1_5_0_21-linux-amd64.bin       #根据提示按enter输入即可

    [root@amoeba local]# mv jdk1.5.0_21/ jdk1.5

    [root@amoeba ~]#vim /etc/profile          # 添加以下配置:

    export JAVA_HOME=/usr/local/jdk1.5

    export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

    export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

    export AMOEBA_HOME=/usr/local/amoeba/

    export PATH=$PATH:$AMOEBA_HOME/bin

    [root@amoeba ~]# source /etc/profile

    [root@amoeba ~]# java -version

    java version "1.5.0_21"

    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_21-b01)

    Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_21-b01, mixed mode)

    2         安装并配置Amoeba软件

    张三

    [root@amoeba ~]# mkdir /usr/local/amoeba

    [root@amoeba ~]# tar xf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

    [root@amoeba ~]# chmod -R 755 /usr/local/amoeba/

    [root@amoeba ~]# /usr/local/amoeba/bin/amoeba

    amoeba start|stop            ##显示此内容说明Amoeba安装成功

    3         配置Amoeba读写分离,两个slave读负载均衡

    3.1         Master,slave01,slave02开放权限给amoeba访问

    grant all on *.* to 'test'@'192.168.1.%' identified by '123.com';

    flush privileges;

    3.2         编辑amoeba.xml配置文件

    修改内容为下列标记位置:

                            <property name="authenticator">

                                    <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

                                            <property name="user">amoeba</property>

                                            <property name="password">123456</property>

                                            <property name="filter">

                                                    <bean class="com.meidusa.amoeba.server.IPAccessController">

                                                            <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>

                                                    </bean>

                                            </property>

                                    </bean>

                            </property>

    修改内容为以下加粗部分,注意删除注释!!!

            <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">

                    <property name="ruleLoader">

                            <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">

                                    <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>

                                    <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>

                            </bean>

                    </property>

                    <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>

                    <property name="LRUMapSize">1500</property>

                    <property name="defaultPool">master</property>

                   

                    <property name="writePool">master</property>

                    <property name="readPool">slaves</property>

                    <property name="needParse">true</property>

            </queryRouter>

    3.3         编辑dbServer.xml配置

    [root@amoeba amoeba]# vim conf/dbServers.xml

    修改内容为以下加粗部分:

                            <!-- mysql user -->

                            <property name="user">test</property>

                            <!--  mysql password-->

                            <property name="password">123.com</property>

                    </factoryConfig>

    以下修改后的内容为加粗的部分:

            <dbServer name="master"  parent="abstractServer">

                    <factoryConfig>

                            <!-- mysql ip -->

                            <property name="ipAddress">192.168.1.101</property>

                    </factoryConfig>

            </dbServer>

            <dbServer name="slave01"  parent="abstractServer">

                    <factoryConfig>

                            <!-- mysql ip -->

                            <property name="ipAddress">192.168.1.102</property>

                    </factoryConfig>

            </dbServer>

            <dbServer name="slave02"  parent="abstractServer">

                    <factoryConfig>

                            <!-- mysql ip -->

                            <property name="ipAddress">192.168.1.103</property>

                    </factoryConfig>

            </dbServer>

            <dbServer name="slaves" virtual="true">

                    <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

                            <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

                            <property name="loadbalance">1</property>

                            <!-- Separated by commas,such as: server1,server2,server1 -->

                            <property name="poolNames">slave01,slave02</property>

                    </poolConfig>

            </dbServer>

    3.4         确认配置无误后,可以启动amoeba软件,其默认的端口是tcp8066

    [root@amoeba amoeba]# ./bin/amoeba start&

    [root@amoeba amoeba]# netstat -anptl |grep 8066

    tcp6     0  0     :::8066     :::*         LISTEN      2663/java

    4         测试

    4.1         在client主机上面安装mysql命令进行测试

    [root@client ~]# yum -y install mysql

    可以通过代理访问MySQL:

    [root@client ~]# mysql -uamoeba -p123456 -h 192.168.1.104 -P8066

    Welcome to the MariaDB monitor.  Commands end with ; or g.

    Your MySQL connection id is 96263158

    Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution

    Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

    MySQL [(none)]>

    4.2         在Master上面创建一个表,然后同步到各从服务器上,然后关闭各种从服务器的slave功能,再插入区别语句

    mysql> use db_test;

    Database changed

    mysql> create table animal(id int(10) primary key,name varchar(20) not null,number int(10) not null);

    Query OK, 0 rows affected (0.01 sec)

    分别在两台从服务器上面关闭slave功能:

    mysql> stop slave;

    Query OK, 0 rows affected (0.00 sec)

    然后在master服务器上面插入区别语句:

    mysql> insert into animal values (1,'elephant',500);

    Query OK, 1 row affected (0.00 sec)

    4.3         从服务器(slave)上面同步了表,手动插入其他内容

    Slave01:

    mysql> use db_test;

    mysql> insert into animal values ('2','tiger',102);

    Query OK, 1 row affected (0.00 sec)

    Slave02:

    mysql> use db_test;

    mysql> insert into animal values (3,'dolphin',103);

    Query OK, 1 row affected (0.00 sec)

    4.4         测试读操作

    在client主机上第一次查询结果如下:

    MySQL [(none)]> select * from db_test.animal;

    +----+---------+--------+

    | id | name    | number |

    +----+---------+--------+

    |  3 | dolphin |    103 |

    +----+---------+--------+

    1 row in set (0.00 sec)

    第二次查询结果如下:

    MySQL [(none)]> select * from db_test.animal;

    +----+-------+--------+

    | id | name  | number |

    +----+-------+--------+

    |  2 | tiger |    102 |

    +----+-------+--------+

    1 row in set (0.01 sec)

    第三次查询结果如下:

    MySQL [(none)]> select * from db_test.animal;

    +----+---------+--------+

    | id | name    | number |

    +----+---------+--------+

    |  3 | dolphin |    103 |

    +----+---------+--------+

    1 row in set (0.00 sec)

    4.5         测试写操作

    在client主机上插入一条语句:

    MySQL [(none)]> insert into db_test.animal values (4,'seagull','105');

    Query OK, 1 row affected (0.00 sec)

    但在client上查询不到,最终只有在Master上才能查看到这条语句内容,说明写操作在Master服务器上

    mysql> select * from db_test.animal;

    +----+----------+--------+

    | id | name     | number |

    +----+----------+--------+

    |  1 | elephant |    500 |

    |  4 | seagull  |    105 |

    +----+----------+--------+

    2 rows in set (0.00 sec)

    由此验证,已经实现了MySQL的读写分离,目前所有的写操作全部都在Master主服务器上,用来避免数据的不同步,所有的读操作都分摊给了Slave从服务器,用来分摊数据库的压力

  • 相关阅读:
    python基础--函数的命名空间and作用域
    MYSQL基础常识
    python基础--函数
    python基础--文件相关操作
    python基础--字符编码以及文件操作
    homebrew长时间停在Updating Homebrew 这个步骤
    python基础--数据类型的常用方法2
    python基础--数据类型的常用方法1
    python基础--定义装饰器(内置装饰器)
    angular创建组件
  • 原文地址:https://www.cnblogs.com/Vampire-MIn/p/13212958.html
Copyright © 2011-2022 走看看