NSD DBA2 DAY06
1 案例1:搭建mycat 分片服務器
1.1 問題
- 數據庫主機 192.168.4.55 使用db1庫存儲數據
- 數據庫主機 192.168.4.56 使用db2庫存儲數據
- 主機 192.168.4.54 運行mycat服務,邏輯庫名稱爲test,鏈接用戶名爲admin,密碼123456
- 在主機 192.168.4.254 訪問測試配置
1.2 方案
準備四臺主機,搭建mycat分片服務器,經過某種特定條件,將存放在一個數據庫(主機)中的數據,分散存放到多個數據庫(主機)中,已達到分散單臺設備負載的效果。其中192.168.4.56做爲mycat服務器,192.168.4.54和192.168.4.55做爲數據庫服務器,192.168.4.254做爲客戶端。如圖-1所示:html

圖-1java
數據分片的拓撲如圖-2所示:node

圖-2mysql
1.3 步驟
實現此案例須要按照以下步驟進行。linux
步驟一:公共配置sql
1)關閉防火牆和selinux,配置yum源(系統源),這裏再也不操做數據庫
2)把54,55還原成獨立數據庫服務器,且只保留默認4個庫其餘都刪除,中止56主機的mha管理服務,下載mycat 軟件到56主機vim
3)在54(主機c2)和55(主機c1)上面建立db1和db2庫服務器
- [root@c1 ~]# mysql -u root -p123456
- mysql> create database db1; //c1上面建立db1庫
- Query OK, 1 row affected (0.00 sec)
- [root@c2 ~]# mysql -u root -p123456
- mysql> create database db2; //c2上面建立db2庫
- Query OK, 1 row affected (0.00 sec)
在54上面受權一個用戶app
- mysql> grant all on *.* to admin@"%" identified by "123456";
- Query OK, 0 rows affected, 1 warning (0.00 sec)
在55上面受權一個用戶
- mysql> grant all on *.* to admin@"%" identified by "123456";
- Query OK, 0 rows affected, 1 warning (0.00 sec)
4)修改數據庫的配置文件
注意:1表明不區分表名的大小寫,0爲區分大小寫
主機c1上面:
- [root@c1 ~]# vim /etc/my.cnf
- [mysqld]
- lower_case_table_names=1 //表名忽略大小寫
- [root@c1 ~]# systemctl restart mysqld
主機c2上面:
- [root@c2 ~]# vim /etc/my.cnf
- [mysqld]
- lower_case_table_names=1
- [root@c2 ~]# systemctl restart mysqld
5)在56主機上面安裝JDK
- [root@mycat ~]# rpm -qa | grep -i jdk //安裝自帶的便可
- java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
- java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
- copy-jdk-configs-2.2-3.el7.noarch
- [root@mycat ~]# yum -y install java-1.8.0-openjdk
6)在56主機上面安裝mycat
- [root@mycat ~]# cd mysql/
- [root@mycat mysql]# tar -xf Mycat-server-1.4-beta-20150604171601-linux.tar.gz //免安裝,解壓便可使用
- [root@mycat mysql]# mv mycat/ /usr/local/
- [root@mycat mysql]# ls /usr/local/mycat/
- bin catlet conf lib logs version.txt
- [root@mycat mysql]# cd /usr/local/mycat/
- [root@mycat mycat]# ./bin/mycat --help
- Usage: ./bin/mycat { console | start | stop | restart | status | dump }
7)修改配置文件
目錄結構說明:
bin mycat命令,如 啓動 中止 等
catlet 擴展功能
conf 配置文件
lib mycat使用的jar
log mycat啓動日誌和運行日誌
wrapper.log mycat服務啓動日誌
mycat.log 記錄SQL腳本執行後的報錯內容
重要配置文件說明:
server.xml 設置連mycat的帳號信息
schema.xml 配置mycat的真實庫表
rule.xml 定義mycat分片規則
配置標籤說明
<user>.. ..</user> 定義連mycat用戶信息
<datanode>.. ..</datanode> 指定數據節點
<datahost>.. ..</datahost> 指定數據庫地址及用戶信息
查看server.xml配置文件
- [root@mycat mycat]# cd conf/
- [root@mycat conf]# vim server.xml
- </system>
- <user name="test"> //鏈接mycat服務時使用的用戶名 test
- <property name="password">test</property>
- //使用test用戶鏈接mycat用戶時使用的密碼
- <property name="schemas">TESTDB</property>
- //鏈接上mycat服務後,能夠看到的庫名多個時,使用逗號分隔 (是邏輯上的庫名,服務器上沒有這個庫名,隨便取,但要記住)
- </user>
- <user name="user">
- <property name="password">user</property>
- <property name="schemas">TESTDB</property>
- <property name="readOnly">true</property>
- //定義只讀權限,使用定義的user用戶鏈接mycat服務後只有讀記錄的權限,不寫這一行則是可讀可寫
- </user>
修改schema.xml配置文件
- [root@mycat conf]# vim schema.xml
- <table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />
- //travelrecord(邏輯上的,名字不能隨便寫,通常不動)表分片到數據節點dn1和dn2,dn1和dn2隨便取的名字
- <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2" />
- <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2" rule="mod-long" />
- <dataNode name="dn1" dataHost="c1" database="db1" />
- //數據節點對應的服務器 name="dn1"名稱要與上面的對應 dataHost="c1"寫本機主機名,database="db1"存在的數據庫名,定義分片使用的庫,所在的物理主機,真正存儲數據的db1庫在物理主機mysql55上
- <dataNode name="dn2" dataHost="c2" database="db2" />
- //定義分片使用的庫,所在的物理主機,真正存儲數據的db1庫在物理主機mysql55上
- 指定c1名稱主機對應的ip地址
- <dataHost name="c1" maxCon="1000" minCon="10" balance="0"
- writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
- <heartbeat>select user()</heartbeat>
- <!-- can have multi write hosts -->
- <writeHost host="c1" url="192.168.4.55:3306" user="admin"
- password="123456">
- //訪問數據庫時,mycat服務鏈接數據庫服務器時使用的用戶名和密碼
- <!-- can have multi read hosts -->
- </writeHost>
- </dataHost>
- 指定c2名稱主機對應的ip地址
- <dataHost name="c2" maxCon="1000" minCon="10" balance="0"
- writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
- <heartbeat>select user()</heartbeat>
- <!-- can have multi write hosts -->
- <writeHost host="c2" url="192.168.4.54:3306" user="admin"
- password="123456">
- //訪問數據庫時,mycat服務鏈接數據庫服務器時使用的用戶名和密碼
- <!-- can have multi read hosts -->
- </writeHost>
- </dataHost>
8)添加PATH路徑
- [root@mycat conf]# export PATH=/usr/local/mycat/bin:$PATH
- [root@mycat conf]# echo "PATH=/usr/local/mycat/bin:$PATH" >> /etc/profile
- [root@mycat conf]# source /etc/profile
- [root@mycat conf]# echo $PATH
- /usr/local/mycat/bin:/usr/local/mycat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- [root@mycat conf]# which mycat
- /usr/local/mycat/bin/mycat
9)啓動服務並查看端口
- [root@mycat conf]# mycat start
- Starting Mycat-server...
- [root@mycat conf]# netstat -antup | grep :8066
- tcp6 0 0 :::8066 :::* LISTEN 6421/java
- [root@mycat conf]# ps -C java
- PID TTY TIME CMD
- 6421 ? 00:00:04 java
用admin用戶登陸
- [root@client ~]# mysql -h192.168.4.54 -uadmin -p123456
- mysql> show processlist;
- +----+-------+--------------------+------+---------+------+----------+------------------+
- | Id | User | Host | db | Command | Time | State | Info |
- +----+-------+--------------------+------+---------+------+----------+------------------+
- | 3 | admin | 192.168.4.56:34580 | db2 | Sleep | 80 | | NULL |
- | 4 | admin | 192.168.4.56:34570 | db2 | Sleep | 100 | | NULL |
- | 5 | admin | 192.168.4.56:34572 | db2 | Sleep | 40 | | NULL |
- | 6 | admin | 192.168.4.56:34562 | db2 | Sleep | 30 | | NULL |
- | 7 | admin | 192.168.4.56:34564 | db2 | Sleep | 90 | | NULL |
- | 8 | admin | 192.168.4.56:34566 | db2 | Sleep | 60 | | NULL |
- | 9 | admin | 192.168.4.56:34574 | db2 | Sleep | 70 | | NULL |
- | 10 | admin | 192.168.4.56:34576 | db2 | Sleep | 10 | | NULL |
- | 11 | admin | 192.168.4.56:34578 | db2 | Sleep | 20 | | NULL |
- | 12 | admin | 192.168.4.56:34568 | db2 | Sleep | 50 | | NULL |
- | 14 | admin | 192.168.4.51:58354 | NULL | Query | 0 | starting | show processlist |
- +----+-------+--------------------+------+---------+------+----------+------------------+
- 11 rows in set (0.00 sec)
- [root@client ~]# mysql -h192.168.4.55 -uadmin -p123456
- mysql> show processlist;
- +----+-------+--------------------+------+---------+------+----------+------------------+
- | Id | User | Host | db | Command | Time | State | Info |
- +----+-------+--------------------+------+---------+------+----------+------------------+
- | 3 | root | localhost | NULL | Sleep | 2352 | | NULL |
- | 4 | admin | 192.168.4.56:45148 | db1 | Sleep | 2 | | NULL |
- | 5 | admin | 192.168.4.56:45150 | db1 | Sleep | 62 | | NULL |
- | 6 | admin | 192.168.4.56:45160 | db1 | Sleep | 12 | | NULL |
- | 7 | admin | 192.168.4.56:45162 | db1 | Sleep | 92 | | NULL |
- | 8 | admin | 192.168.4.56:45152 | db1 | Sleep | 32 | | NULL |
- | 9 | admin | 192.168.4.56:45154 | db1 | Sleep | 42 | | NULL |
- | 10 | admin | 192.168.4.56:45156 | db1 | Sleep | 22 | | NULL |
- | 11 | admin | 192.168.4.56:45158 | db1 | Sleep | 82 | | NULL |
- | 12 | admin | 192.168.4.56:45164 | db1 | Sleep | 52 | | NULL |
- | 13 | admin | 192.168.4.56:45166 | db1 | Sleep | 72 | | NULL |
- | 14 | admin | 192.168.4.51:32796 | NULL | Query | 0 | starting | show processlist |
- +----+-------+--------------------+------+---------+------+----------+------------------+
- 12 rows in set (0.00 sec)
- [root@mycat conf]# ls /usr/local/mycat/logs/
- mycat.log mycat.pid wrapper.log //wrapper.log爲錯誤日誌
- [root@mycat conf]# ldconfig -v //更新加載的模塊
10)客戶端訪問
命令: mysql -hmycat主機的IP -P端口號 -u用戶 -p密碼
- [root@clent ~]# mysql -h192.168.4.56 -P8066 -utest -ptest
- mysql> show databases;
- +----------+
- | DATABASE |
- +----------+
- | TESTDB |
- +----------+
- 1 row in set (0.00 sec)
- mysql> USE TESTDB;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
- mysql>
- mysql> show tables;
- +------------------+
- | Tables in TESTDB |
- +------------------+
- | company |
- | customer |
- | customer_addr |
- | employee |
- | goods |
- | hotnews |
- | orders |
- | order_items |
- | travelrecord |
- +------------------+
- 9 rows in set (0.00 sec)
11)客戶端測試:
- mysql> create table employee(id int not null primary key,name varchar(100),sharding_id int not null);
- Query OK, 0 rows affected (0.10 sec)
- mysql> insert into employee(id,name,sharding_id) values(1,"bob",10000);
- Query OK, 1 row affected (0.03 sec)
- mysql> insert into employee(id,name,sharding_id) values(1,"lucy",10010);
- Query OK, 1 row affected (0.02 sec)
- mysql> select * from employee;
- +----+------+-------------+
- | id | name | sharding_id |
- +----+------+-------------+
- | 1 | bob | 10000 |
- | 1 | lucy | 10010 |
- +----+------+-------------+
- 2 rows in set (0.06 sec)
12)在c1上面查看結果
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | db1 |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 5 rows in set (0.00 sec)
- mysql> use db1;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
- mysql> show tables;
- +---------------+
- | Tables_in_db1 |
- +---------------+
- | employee |
- +---------------+
- 1 row in set (0.00 sec)
- mysql> select * from employee; //查看結果
- +----+------+-------------+
- | id | name | sharding_id |
- +----+------+-------------+
- | 1 | bob | 10000 |
- +----+------+-------------+
- 1 row in set (0.00 sec)
13)在c2上面查看結果
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | db2 |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 5 rows in set (0.00 sec)
- mysql> use db2;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
- mysql> show tables;
- +---------------+
- | Tables_in_db2 |
- +---------------+
- | employee |
- +---------------+
- 1 row in set (0.00 sec)
- mysql> select * from employee;
- +----+------+-------------+
- | id | name | sharding_id |
- +----+------+-------------+
- | 1 | lucy | 10010 |
- +----+------+-------------+
- 1 row in set (0.00 sec)