Kafka集群搭建及安全机制手册

Mycat+Mysql的读写分离

前言:

MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。

在这里,我用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能。

环境:

  • 虚拟机:virtualbox;镜像:centos7; MyCATMySQL5.6
    • MySQL安装:
        • yum install wget 
        • wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm(下载mysqlrepo)
        • sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
        • sudo yum install mysql-server
        • mysql -u root ,可以看到系统报错,
        • 解决授权:sudo chown -R root:root /var/lib/mysql
        • 重启服务:systemctl restart mysqld.service
        • 修改mysql的密码:set password for 'root'@'localhost'=password('root');
        • GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;  授权允许远程登录
        • FLUSH   PRIVILEGES;
        • 退出mysql,重启mysql

 

 

    • MyCAT安装
        • wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
        • tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz  
        • cp -r  mycat /usr/local/mycat  
        • cd /usr/local/mycat/  
        • chmod +x *  
        • 配置环境变量
            • vi /etc/profile
            • 在文件添加一行:export MYCAT_HOME=/usr/local/mycat
            • 使修改生效:source /etc/profile
            • 测试是否生效:echo $MYCAT_HOME
    • 安装JDKMyCAT依赖于JDK
        • yum search java-1.7.0    yum install xxxxx
        • 配置环境变量
            • vim /etc/profile并添加:
            • export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
            • export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
            • export PATH=$PATH:$JAVA_HOME/bin
            • 使配置文件生效:source /etc/profile
            • 测试:echo $JAVA_HOME
            • 输入命令:java -version

 

  • 三台虚拟服务器,MyCAT部署到其中一台服务器上
    • 分别实现     1.二主一从   2.一主二从

一主二从模式读写分离:

MyCAT   172.16.92.159 Port8066/9066

MySQL Master 172.16.92.159  Port3306

MySQL Slave   172.16.92.151  Port3306

MySQL Slave   172.16.92.152  Port3306

MyCAT 8066:使用端口;9066:管理端口

主从复制实现步骤:

        • 在主服务器上修改配置文件:    vi /etc/my.cnf

[mysqld]

# my add

server-id=1(数据库id号,注意唯一)

log-bin=mysql-bin(把更新的记录写到二进制文件中)

log-slave-updates(把更新的记录写到二进制文件中)

        • 退出后重启服务:systemctl restart mysqld.service

 

        • 在从1服务器上修改配置文件:  vi /etc/my.cnf

[mysqld]

# my add

server-id=2

relay-log=relay-bin(从主服务器读并记录到本地)

        • 退出后重启服务:systemctl restart mysqld.service

 

        • 在从2服务器上修改配置文件:  vi /etc/my.cnf

[mysqld]

# my add

server-id=3

relay-log=relay-bin(从主服务器读并记录到本地)

        •   退出后重启服务:systemctl restart mysqld.service

 

        • 在主服务器上创建有复制权限的账号
            • grant replication slave on *.* to 'slave'@'172.16.92.%' identified by '1234';
            • 刷新权限:flush privileges;
        • 在主服务器上查看状态信息:
            • [root@localhost ~]# mysql -u root -proot
            • mysql > show master status; 

 

 

 

 

        • 分别在两台从服务器上连接主服务器
            • [root@localhost ~]# mysql -u root -proot
            • 如果之前配置过主从需要执行命令:stop slave;
            • mysql> change master to master_host='172.16.92.159',master_user='slave',master_password='1234',master_log_file='mysql-bin.000043',master_log_pos=716;
            • 解释:host:masterip地址;usermaster上创建的账户;password:账户的密码;其他要与master服务器查看的状态匹配
            • 开启复制 mysql> start slave;
            • 查看slave状态 mysql> show slave statusG;
            • 注意:Slave_IO_Running Slave_SQL_Running的状态必须都为yes,如果不是,一般是两个问题:防火墙没有关闭,第三步输入的不准确,需要回到第二步开始。
        • 测试
            • 在主服务器上创建表并插入数据

mysql> create table me(id int);

mysql> insert into me values(1);

            • 在两台从服务器上查看,一主两从复制完成。

MyCAT实现读写分离

配置:

        • 配置文件非常多.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个文件 server.xml   schema.xml
        • A:进入conf目录,修改schema.xml文件(本例没有用到分片) 

配置解析:

        • schemamycat的逻辑数据库
            • table:定义了 MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。
                • name:定义逻辑表的表名,这个名字就如同我在数据库中执行 create table 命令指定的名字一样
                • dataNode:该属性的值需要和 dataNode 标签中 name 属性的值相互对应。
        • dataNode:该属性用于绑定逻辑库到某个具体的 database
            • dataHost:该属性用于定义该分片属于哪个数据库实例的
            • database 属性:该属性用于定义该分片属性哪个具体数据库实例上的具体库
        • dataHost :定义了具 体的数据库实例、读写分离配置和心跳语句。
            • name:唯一标识 dataHost 标签,供上层的标签使用。
            • balance:属性负载均衡类型,目前的取值有 4
              • balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
              • balance="1",全部的 readHost stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 M2->S2,并且 M1 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
              • balance="2",所有读操作都随机的在 writeHost readhost 上分发。
              • balance="3" 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,如果从服务器都挂了,过一段延迟之后,自动读主服务器。注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
            • writeType:负载均衡类型,目前的取值有 3
              • writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
              • writeType="1",所有写操作都随机的发送到配置的 writeHost
              • writeType=“2",没实现。
            • switchType
              • -1 表示不自动切换
              • 1 默认值,自动切换。 
              • 2 基于MySQL 主从同步的状态决定是否切换   心跳语句为 show slave status
              • 3 基于MySQLgalarycluster的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’
              • 注意:实际环境不应该在slave进行写操作。
            • heartbeat :指明用于和后端数据库进行心跳检查的语句
                • 主从切换的语句必须是:show slave status
        • writeHost 标签、readHost 标签
            • host:用于标识不同实例
            • url :后端实例连接地址
            • weight:权重 配置在 readhost 中作为读节点的权重(1.4)

 

常见坑位1:此配置在主机宕机后,msyql数据库就瘫痪了。

解决:可以把其中一台从机分配成writeHost,再第一个writeHost(主机)宕机后自动切换至第二个writeHost

常见坑位2:此时出现了新的问题,读数据可以,写数据也可以。在把第一个wirteHost启动后,新添加的数据并没有保存到主机中而是报存到了第二个writeHost(从机中)。

解决:官网表示讨论了很久,建议重新手工配置主从复制关系。原从配成现主,原主作为现从加入到集群中。

所以。下面介绍了双主一从模式。(主从互为主备)

 

 

 

        • B:进入conf目录,修改server.xml文件 
        • 这里的schema一定要和前面的schema.xml中的name对应
        • 配置完毕后启动mycat[root@localhost conf]# ../bin/./mycat start

 

测试:

        • [root@localhost conf]# mysql -u test -ptest -P8066 -h配置了mycatip,登录成功说明配置成功,插入数据然后在别的机子上看是否一致。
        • 如果其他服务器访问失败,记得要开放端口号

二主一从模式读写分离:(二台主互为主从)

MyCAT   172.16.92.159 Port8066/9066

MySQL Master 172.16.92.159  Port3306

MySQL Master 172.16.92.151  Port3306

MySQL Slave   172.16.92.152  Port3306

MyCAT 8066:使用端口;9066:管理端口

主从复制实现步骤:

        • 在主1服务器上修改配置文件:    vi /etc/my.cnf

[mysqld]

# my add

server-id=1(数据库id号,注意唯一)

log-bin=mysql-bin(把更新的记录写到二进制文件中)

log-slave-updates(把更新的记录写到二进制文件中)

auto-increment-increment=2(自动增长的步长 解决多个主机自动增长出现重复问题)

auto-increment-offset=1(自动增长的起始数值  

        • 保存退出后重启mysql服务

 

        • 在主2服务器上修改配置文件:    vi /etc/my.cnf

server-id=2

log-bin=mysql-bin

log-slave-updates

auto-increment-increment=2

auto-increment-offset=2

        • 保存退出后重启mysql服务

 

        • 在从服务器上修改配置文件:    vi /etc/my.cnf

[mysqld]

# my add

server-id=3

relay-log=relay-bin

        • 保存退出后重启mysql服务

 

        • 在主1服务器上创建有复制权限的账号
            • mysql> grant replication slave on *.* to 'user1'@'172.16.92.%' identified by '1234';
            • 刷新权限:mysql> flush privileges;
        • 在主1服务器上查看状态信息
            • mysql> show master status; 

 

 

 

 

        • 在主2服务器上连接主1服务器
            • mysql> stop slave;
            • mysql> change master to master_host=‘172.16.92.159',master_user='user1',master_password='1234',master_log_file='mysql-bin.000044',master_log_pos=418;
            • 开启复制 mysql> start slave;
            • 查看slave状态 mysql> show slave statusG;
            • 注意:Slave_IO_Running Slave_SQL_Running的状态必须都为yes,如果不是,一般是两个问题:防火墙没有关闭,第二步输入的不准确。

 

        • 在从服务器上连接主服务器
            • [root@localhost ~]# mysql -u root -proot
            • 如果之前配置过主从需要执行命令:stop slave;
            • mysql> change master to master_host='172.16.92.159',master_user='user1',master_password='1234',master_log_file='mysql-bin.000044',master_log_pos=418;
            • 解释:host:masterip地址;usermaster上创建的账户;password:账户的密码;其他要与master服务器查看的状态匹配
            • 开启复制 mysql> start slave;
            • 查看slave状态 mysql> show slave statusG;
            • 注意:Slave_IO_Running Slave_SQL_Running的状态必须都为yes,如果不是,一般是两个问题:防火墙没有关闭,第三步输入的不准确,需要回到第二步开始。

 

        • 在主2服务器上创建有复制权限的账号
            • mysql> grant replication slave on *.* to 'user2'@'172.16.92.%' identified by '1234';
            • 刷新权限:mysql> flush privileges;
            • 查看状态信息:mysql> show master status; 

 

 

 

 

        • 在主2服务器上连接主1服务器
            • mysql> stop slave;
            • mysql> change master to master_host=‘172.16.92.159',master_user='user1',master_password='1234',master_log_file='mysql-bin.000044',master_log_pos=1014;
            • 开启复制 mysql> start slave;
            • 查看slave状态 mysql> show slave statusG;
            • 注意:Slave_IO_Running Slave_SQL_Running的状态必须都为yes,如果不是,一般是两个问题:防火墙没有关闭,第二步输入的不准确。
        • 至此,二主一从配置完成
        • 测试:
            • 分别在主1和主2修改数据,查看其他服务器数据是否一致

MyCAT实现读写分离

配置:

        • 配置文件非常多.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个文件 server.xml   schema.xml
        • A:进入conf目录,修改schema.xml文件

 

 

 

 

 

 

 

        • B:修改server.xml文件 
        • C:重启mycat

测试:

        • [root@localhost conf]# mysql -u test -ptest -P8066 -h配置了mycatip,登录成功说明配置成功,插入数据然后在别的机子上看是否一致。

 

补充:

本文配置的是写在主机1,读在从机,备用是主机2,如果主机1宕机,则自动使用主机2,读写都会存到主机2中。此时重启主机1后,发现数据是一致的,这都归功于mysql配置中的log-slave-updates属性。

 

常见坑位3:使用Jmeter分别对mycatmysql进行压力测试的时候,mycat性能没有mysql性能好。

解决:这是由于我搭建好MyCAT后,为了追踪MyCAT读写的详细信息,在conf/log4j2.xml设置为了debug模式。之后经过多次压力测试实验,再改为默认info模式后,性能会恢复。

原文地址:https://www.cnblogs.com/it-seanol/p/8945142.html