mysql本机多实例安装,并部署Mycat集群,以及安装ZooKeeper 主从架构 集群方案


groupadd mysql
useradd -r -g mysql mysql
axel -n 50 https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-el7-x86_64.tar.gz
tar xvf mysql-5.7.21-el7-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.21-el7-x86_64 /usr/local/mysql/
chown -R mysql:mysql /usr/local/mysql/
mkdir -pv /home/data/mysql_330{6...9}
mkdir /home/data/logs
chown -R mysql:mysql /home/data/
cd /usr/local/mysql/

vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile

初始化实例目录:

/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3306
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3307
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3308
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3309
cp -a ./support-files/my-default.cnf /etc/my.cnf
cp -a ./support-files/mysql.server  /etc/init.d/mysqld

修改配置: vi /etc/my.cnf

[client]
default-character-set = utf8

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin =/usr/local/mysql/bin/mysqladmin
log =/home/data/logs/mysqld_multi.log

[mysqld6]
basedir=/usr/local/mysql
datadir=/home/data/mysql_3306
port=3306
server_id=6
socket=/home/data/mysql_3306/mysql.sock
symbolic-links=0
character_set_server=utf8
pid-file=/home/data/mysql_3306/mysql.pid
wait_timeout=1814400
max_connections = 1500

skip-name-resolve
log_bin = mysql-bin
log-slave-updates
auto-increment-increment = 2 
auto-increment-offset = 1

[mysqld7]
basedir=/usr/local/mysql
datadir=/home/data/mysql_3307
port=3307
server_id=7
socket=/home/data/mysql_3307/mysql.sock
symbolic-links=0
character_set_server=utf8
pid-file=/home/data/mysql_3307/mysql.pid
wait_timeout=1814400
max_connections = 1500

skip-name-resolve
log_bin = mysql-bin

[mysqld8]
basedir=/usr/local/mysql
datadir=/home/data/mysql_3308
port=3308
server_id=8
socket=/home/data/mysql_3308/mysql.sock
symbolic-links=0
character_set_server=utf8
pid-file=/home/data/mysql_3308/mysql.pid
wait_timeout=1814400
max_connections = 1500

skip-name-resolve
log_bin = mysql-bin

[mysqld9]
basedir=/usr/local/mysql
datadir=/home/data/mysql_3309
port=3309
server_id=9
socket=/home/data/mysql_3309/mysql.sock
symbolic-links=0
character_set_server=utf8
pid-file=/home/data/mysql_3309/mysql.pid
wait_timeout=1814400
max_connections = 1500

skip-name-resolve
log_bin = mysql-bin

参数解释如下:
auto_increment_offset表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto_increment_increment表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535

为了避免两台服务器同时做更新时自增长字段的值之间发生冲突。一般在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,
而要把auto_increment_offset分别配置为1和2.

#master1上
[mysqld]
server-id=101log-bin = mysql-bin
auto-increment-increment = 2
auto-increment-offset = 1000
#master2上
[mysqld]
server-id=103log-bin = mysql-bin
auto-increment-increment = 2
auto-increment-offset = 1001

由于二都只有server-id不同和 auto-increment- offset不同auto-increment-offset是用来设定数据库中自动增长的起点的,
回为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,
这样才能避免两台服务器数据同步时出现主键冲突,配置好重启MySQL读取新的配置文件,
另外auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2


启动多实例数据库:
mysqld_multi --defaults-extra-file=/etc/my.cnf start 6,7,8,9

查看多个实例数据库:
mysqld_multi --defaults-extra-file=/etc/my.cnf report

停止多实例:
mysqld_multi --defaults-extra-file=/etc/my.cnf stop 6,7,8,9

各自登录mysql实例:  # 需要指定启动的socket就可以登录到各自的mysql实例
mysql --socket=/home/data/mysql_3306/mysql.sock 
--
set password =password('bnh1923');
grant all on *.* to 'root'@'%' IDENTIFIED BY 'bnh1923' with grant option;
flush privileges;
--
修改后登陆mysql实例:
mysql -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock 
mysqladmin命令用法: https://abc.htmltoo.com/thread-620.htm
mysqladmin -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock 
mysqladmin -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock shutdown  (关闭服务)
mysqld_multi --defaults-extra-file=/etc/my.cnf report
...
mysql --socket=/home/data/mysql_3307/mysql.sock
...
启用: mysqld_multi --defaults-extra-file=/etc/my.cnf start 6,7,8,9

检查端口:
ss -lntup |egrep '3306|3307|3308|3309'
tcp    LISTEN     0      80                     *:3306                  *:*      users:(("mysqld",19973,22))
tcp    LISTEN     0      80                     *:3307                  *:*      users:(("mysqld",20537,22))
...
配置主从:

master-mysql:
mysql -uroot -pbnh1923  --socket=/home/data/mysql_3306/mysql.sock
CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'mysql';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1';
show master status;
#mysql-bin.000001 | 613

slave-mysql:
mysql -uroot -pbnh1923  --socket=/home/data/mysql_3307/mysql.sock
CHANGE MASTER TO MASTER_HOST='127.0.0.1',
    ->                  MASTER_PORT=3306,
    ->                  MASTER_USER='repl',
    ->                  MASTER_PASSWORD='mysql',
    ->                  MASTER_LOG_FILE='mysql-bin.000001',
    ->                  MASTER_LOG_POS=613;
start slave;
show slave status\G

配置主主: (同理配置主从)

验证数据是否同步:

master上创建数据:
create database test;
use test;
create table temp(id int,name varchar(64));
insert into temp values(1,'aaa')
insert into temp values(2,'bbb')
select * from test.temp;

slave上查看数据:
select * from test.temp;
cd bin/
./mysqld_safe --user=mysql & /etc/init.d/mysqld restart
chkconfig --level 35 mysqld on
cat /root/.mysql_secret 
./mysql -uroot -p
SET PASSWORD = PASSWORD('bnh1923');
use mysql; 
update user set host = '%' where user = 'root';
/etc/init.d/mysqld restart


mycat集群部署文档

SSH互信免密码登陆,安装部署jdk. host修改, 创建新用户: https://abc.htmltoo.com/thread-43497.htm

jdk安装:1.7

Mysql及zookeeper安装:(略)

 

Mycat安装

1、下载并解压mycat

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 
mv mycat /home/data/

2、配置schema.xml文件

  • balance="1"
    全部的readHost与stand by writeHost参与select语句的负载均衡
  • writeType="0"
    所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties
  • switchType="1"
    默认值为1,自动切换

cd  /home/data/mycat

cp conf/schema.xml conf/schema.xml.bak

vi  conf/schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
    <dataNode name="dn1" dataHost="node1" database="test" />
    <dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
        <writeHost host="master1" url="127.0.0.1:3306" user="root" password="mysql">
            <readHost host="slave2" url="127.0.0.1:3307" user="root" password="mysql" />
            <readHost host="slave3" url="127.0.0.1:3308" user="root" password="mysql" />
            <readHost host="slave4" url="127.0.0.1:3309" user="root" password="mysql" />
        </writeHost>
        <writeHost host="master2" url="192.168.56.13:3306" user="root" password="mysql">
            <readHost host="slave2" url="192.168.56.13:3307" user="root" password="mysql" />
        </writeHost>   # (第二组主从,如无,请注释忽略)
    </dataHost>
</mycat:schema>

官方案例:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
      <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
      <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
      <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
      <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
      <schema name="zhime-theme" checkSQLschema="true" sqlMaxLimit="100" dataNode="zhime-theme"/>
      <!-- 定义数据的操作节点 -->
      <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
      <!-- “database="mldn"”:定义数据节点要使用的数据库名称 -->
      <dataNode name="zhime-theme" dataHost="zhime-theme" database="zhime-theme" />
      <!-- 定义数据节点,包括了各种逻辑项的配置 -->
      <dataHost name="zhime-theme" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
          <!-- 配置真实MySQL与MyCat的心跳 -->
          <heartbeat>select user()</heartbeat>
          <!-- 配置真实的MySQL的连接路径 -->
          <writeHost host="zhime-theme" url="10.10.111.2:3306" user="root" password="bnh1923"></writeHost>
      </dataHost>
</mycat:schema>

3、配置server.xml文件

cp conf/server.xml conf/server.xml.bak

vi conf/server.xml

<user name="root"> 
  <property name="password">123456</property>
  <property name="schemas">TESTDB</property>
</user>
 案例:
 <user name="root">     <!-- 定义登录mycat对的用户权限 -->
                <property name="password">bnh1923</property>
                <property name="schemas">zhime-theme</property> 
                #若要访问zhime-theme 必须现在server.xml 中定义,否则无法访问zhime-theme
                <!-- 表级 DML 权限设置 -->
                <!--            
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
                 -->
</user>
<user name="zhime-theme">
                <property name="password">bnh1923</property>
                <property name="schemas">zhime-theme</property>
                <property name="readOnly">false</property>  <!-- 配置是否允许只读 -->
 
</user>

mycat结合MySQL的双主(主从)实现读写分离,修改好.启动mycat.

./bin/mycat start # 启动mycat
ss -lntup |egrep  '(8066|9066)'   # 验证mycat服务是否正常
tcp    LISTEN     0      100     :::8066       :::*      users:(("java",16546,79))
tcp    LISTEN     0      100     :::9066       :::*      users:(("java",16546,75))

master端配置mycat连接账号:

mysql -uroot -pbnh1923  --socket=/home/data/mysql_3306/mysql.sock

GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'bnh1923';

在mycat服务器上安装mysql服务,但是不启动.

使用mysql的客户端连接mycat.

mysql -uroot -pbnh1923  --socket=/home/data/mysql_3306/mysql.sock -P 8066

#mysql -uroot -p -P 8066 -h 127.0.0.1 #连接mycat,初始密码123456#

show databases;

use test;

insert into temp values(3,'ccc');

slave端查看数据是否同步:

select * from test.temp;

多组主主服务自动迁移-测试

关闭node2-master的MySQL服务:

mysql -uroot -pbnh1923 -P 3066 -h 127.0.0.1
mysql> shutdown;
Query OK, 0 rows affected (0.01 sec)
shell > ss -lntup |grep 3306

mycat端插入新的数据查看数据是否同步:

mysql -uroot -p -P 8066 -h 127.0.0.1 
mysql> insert into temp values(4,'ddd');
Query OK, 1 row affected (0.07 sec)

node1 slave端查看数据是否同步:

mysql -uroot -p -P 3068 -h 127.0.0.1

select * from test.temp

node2 slave端查看数据是否同步: 

mysql -uroot -p -P 3067 -h 127.0.0.1

select * from test.temp

发现因为node2的master端已经挂了,数据不能同步了.

数据访问是否正常:

mysql -uroot -p -P 8066 -h 127.0.0.1

select * from temp;

执行多次发现结果一样,说明在一台master端挂掉的情况下,其连接的slave端也被剔除,因此数据完整性可以保证.


4、配置myid.properties文件 

--
wget http://nexus.mycat.io/content/groups/public/io/mycat/mycat/Mycat-web/1.0-SNAPSHOT/Mycat-web-1.0-20160617.083134-5-20160617163048-linux.tar.gz
vi mycat-web/WEB-INF/classes/mycat.properties
--
zookeeper=10.10.111.80:2181
sqlonline.server=10.10.111.2
sqlonline.user=root
sqlonline.passwd=bnh1923
--
web访问:http://localhost:8082/mycat

5.配置rule.xml(略)

6.初始化zk配置: conf]# ../bin/init_zk_data.sh

7.启动mycat服务: conf]# ../bin/mycat/mycat start

8.多实例配置:

vim schema.xml
--
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema>
        <schema name="aone" checkSQLschema="false" sqlMaxLimit="100" dataNode="aone"/>
        <schema name="mtop" checkSQLschema="false" sqlMaxLimit="100" dataNode="mtop"/>
        <dataNode name="aone" dataHost="aone" database="aone"/>
        <dataNode name="mtop" dataHost="mtop" database="mtop"/>
        <dataHost name="aone" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select 1</heartbeat>
                <writeHost host="aone" url="192.168.1.220:3301" user="root" password="bnh1923"/>
        </dataHost>
        <dataHost name="mtop" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select 1</heartbeat>
                <writeHost host="mtop" url="192.168.1.220:3302" user="root" password="bnh1923"/>
        </dataHost>
</mycat:schema>
--
vim server.xml
--
        <user name="aone">
                <property name="password">bnh1923</property>
                <property name="schemas">aone</property>
        </user>
        <user name="mtop">
                <property name="password">bnh1923</property>
                <property name="schemas">mtop</property>
	</user>
--


ZooKeeper部署管理Mycat

ZooKeeper 是一个面向分布式系统的构建块。当设计一个分布式系统时,一般需要设计和开发一些协调服务:
名称服务— 名称服务是将一个名称映射到与该名称有关联的一些信息的服务。电话目录是将人的名字映射到其电话号码的一个名称服务。同样,DNS 服务也是一个名称服务,它将一个域名映射到一个 IP 地址。在分布式系统中,您可能想跟踪哪些服务器或服务在运行,并通过名称查看其状态。ZooKeeper 暴露了一个简单的接口来完成此工作。也可以将名称服务扩展到组成员服务,这样就可以获得与正在查找其名称的实体有关联的组的信息。
锁定— 为了允许在分布式系统中对共享资源进行有序的访问,可能需要实现分布式互斥(distributed mutexes)。ZooKeeper 提供一种简单的方式来实现它们。
同步— 与互斥同时出现的是同步访问共享资源的需求。无论是实现一个生产者-消费者队列,还是实现一个障碍,ZooKeeper 都提供一个简单的接口来实现该操作。
配置管理— 您可以使用 ZooKeeper 集中存储和管理分布式系统的配置。这意味着,所有新加入的节点都将在加入系统后就可以立即使用来自 ZooKeeper 的最新集中式配置。这还允许您通过其中一个 ZooKeeper 客户端更改集中式配置,集中地更改分布式系统的状态。
领导者选举— 分布式系统可能必须处理节点停机的问题,您可能想实现一个自动故障转移策略。ZooKeeper 通过领导者选举对此提供现成的支持。




系统:CentOS7.3
jdk版本:1.7
zookeeper版本:3.4.10
mycat版本:1.6

hostnameIPmyid
testA192.168.33.111
testB192.168.33.122
testC192.168.33.133

为了测试方便,这里关闭系统防火墙和禁用selinux,生产环境防火墙则需要开放zookeeper相关端口,2181、2888、3888。

先在testA节点安装,再同步到其它2个节点。

mkdir -p /data/packages/
cd /data/packages/
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
cd /usr/local/
tar -zxvf /data/packages/zookeeper-3.4.10.tar.gz
ln -s zookeeper-3.4.10 zookeeper
cd zookeeper
mkdir data log
cd conf/
cp zoo_sample.cfg zoo.cfg

修改配置文件 vim zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
# the port at which the clients will connect
clientPort=2181
server.1=192.168.33.11:2888:3888
server.2=192.168.33.12:2888:3888
server.3=192.168.33.13:2888:3888
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

添加myid文件, 同步zookeeper目录到其它2个节点,修改myid:

1
2
3

vim /usr/local/zookeeper/data/myid 写入 1

rsync -avzP /usr/local/zookeeper/ root@192.168.33.12:/usr/local/zookeeper/

rsync -avzP /usr/local/zookeeper/ root@192.168.33.13:/usr/local/zookeeper/

vi /usr/local/zookeeper/data/myid 写入 1

vi /usr/local/zookeeper/data/myid 写入 1

启动zookeeper:cd /usr/local/zookeeper/bin/

cd /usr/local/zookeeper/bin/
./zkServer.sh start

3个节点Mycat都执行mycat初始化数据: 

sh /usr/local/mycat/bin/init_zk_data.sh

配置mycat支持zookeeper:

vim /usr/local/mycat/conf/myid.properties

loadZk=true
# zk集群地址,多个用","隔开
zkURL=127.0.0.1:2181
# zk集群内Mycat集群ID
clusterId=mycat-cluster-1
# Mycat集群内本实例ID,禁止重复
myid=mycat_fz_01
# Mycat集群内节点个数
clusterSize=3
clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_03
#server  booster  ;   booster install on db same server,will reset all minCon to 1
type=server
boosterDataHosts=dataHost1

用zookeeper配置mycat:

使用ZooInspector工具管理ZooKeeper,以下是连接zookeeper方法。


连接成功后,可看到mycat集群的配置.


修改相应配置


启动mycat后,mycat配置文件会自动更新。


注意事项:
* loadZk必须改为true才生效
* zkURL的地址是多个中间用“,”隔开
* clusterId,同一个zk内的集群ID必须唯一
* Myid:本实例的id在当前的mycat集群内ID唯一
* 配置完zk并启动mycat后,会更新本地conf下的相关配置文件。


https://blog.csdn.net/ygqygq2/article/details/78292828


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回