標籤:規則 mysq 技術 表結構 多個 個人 關鍵字 通訊 個數
==========================業務垂直分割:
1》介紹說明:
隨著公司的業務規模擴充,DBA需要根據企業資料業務進行切割,垂直切割又稱為縱向切割,垂直資料切割是根據企業網站業務、產品進行切分,比如:使用者數 據、部落格文章資料、照片資料、標籤資料類型、群組數等等,每個業務都獨立的分庫分表進行切割. 如果一個應用只針對單純的業務功能模組,那麼可以直接連接相應 的被垂直切分的資料庫,但是有些複雜的應用需要利用到相當多的業務資料,甚至牽扯到所有業務資料那麼垂直切割將給應用帶來一定的複雜度,而且對研發人員也會 有一定的影響,導致整個應用複雜度提升,那麼Amoeba在其中充當了門面功能,疏通應用於多個資料庫的通訊如果垂直切分功能:假如有有3個資料庫:userdb blogdb otherdb
2》DB架構圖:
================================業務水平分割
1》介紹說明:
上次我們講到垂值切割。那麼如果垂值切割不能滿足企業需求怎麼辦??那麼我們對架構進行進一步最佳化,讓水平切割來解決這一問題,水平切割根User_ID範 圍值劃分,然後再進去模數 % 2 ,那麼最終得到的值只有0 和1定義到每台DB Server 上去。此範圍適合用於中小DB架構擴充,我們將在下一章將講到360度環形庫 的擴充,將用於大型DB架構設計;
需求說明:
總使用者數量500萬
User_DB 儲存使用者基本資料<如、登入認證、個人資訊>
Blog_DB 儲存使用者部落格文章
Other_DB 儲存其它業務
經過垂直分割將3個DB分割到不同的伺服器上面,然後進行水平切割將DB使用者量分割開來,
User_DB1 承載250萬使用者的基本資料 User_ID範圍值<500萬 User_ID模數 % 2 取值0的讀此伺服器
User_DB2 承載250萬使用者的基本資料 User_ID範圍值<500萬 User_ID模數 % 2 取值1的讀此伺服器
Blog_DB1 承載250萬使用者的部落格文章 User_ID範圍值<500萬 User_ID模數 % 2 取值0的讀此伺服器
Blog_DB2 承載250萬使用者的部落格文章 User_ID範圍值<500萬User_ID模數 % 2 取值1的讀此伺服器
Other_DB1 承載250萬使用者的其它資訊 User_ID範圍值<500萬User_ID模數 % 2 取值0的讀此伺服器
Other_DB2 承載250萬使用者的其它資訊 User_ID範圍值<500萬User_ID模數 % 2 取值1的讀此伺服器
相當於2台機器針對500萬使用者。各承載了。2分之1,此範圍可以根據ID範圍值,無限擴充下去。
2》DB架構圖
3》環境案例實戰
因為我們上面已經講過了讀寫分離,這個實戰案例主要講水平分割,通過Amoeba實現分割,判斷ID範圍值與模數
1>Amoeba_Server(Linux) 10.0.0.203 實現水平切割
2>User_DBA_Server1(Linux) 10.0.0.201 承載250萬使用者基本資料User_ID範圍值<500萬 User_ID模數 % 2 取值0的讀此伺服器
3>User_DBA_Server2(Linux) 10.0.0.202 承載250萬使用者基本資料User_ID範圍值<500 User_ID模數 % 2 取值1的讀此伺服器
相當於2台機器針對500萬用三戶。各承載了。2分之1,此範圍可以根據ID範圍值,無限擴充下去。注意這2台機器。並沒有做主 從,是單獨的兩台單機MYSQL
4》設定DB_server1 DB_server2 設定Amoeba遠端存取授權
mysql-->grant all privileges on *.* to [email protected]‘%‘ identified by ‘123456‘;
mysql-->flush privileges;
5》建立測試表
在DB_server1 和DB_server2 上,兩邊的表結構以及表名是一樣的。注意。
建立t_user表
create table zyalvin (
user_id integer unsigned not null,
user_name varchar(45),
user_address varchar(100),
primary key (user_id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec
6》配置Amoeba IP 與使用者
vim /usr/local/amoeba/conf/amoeba.xml
7》配置Server1和Server2
配置Server1:
配置Server2
8》配置水平分割規則
# vim /usr/local/amoeba/conf/rule.xml
tableRule name=”zyalvin,t_user”可以多個表,
啟動服務
#:nohup bash -x amoeba &
9》插入測試資料
在Amoeba Server登入:
# mysql -uroot -p123456 -h 192.168.100.214 -P 9006
mysql->use zytest;
mysql->insert into zyalvin(user_id,user_name,user_address)values(‘1‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘2‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘3‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘4‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘5‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘6‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘7‘,‘user1‘,‘China‘);
mysql->insert into zyalvin user_id,user_name,user_address)values(‘8‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘9‘,‘user1‘,‘China‘);
mysql->insert into zyalvin (user_id,user_name,user_address)values(‘10‘,‘user1‘,‘China‘);
DB_server1查看,偶數全部寫入了server1
DB_server2 查看,奇數全部寫入了server2
總結:
(1)amoeba 是根據 sql 解析來進行水平切分的,需要把切分的關鍵字段(這裡是user_id),加入到insert sql語句中,否則切分規 則無效。無效後,會在 server1, server2 均都插入資料。
(2)amoeba插入資料的時候必須先use dbname(比如要先use test庫名,或者查詢帶上庫名和表名,test.t_user) 否則插入資料會默 認插到server1上面
(3)在rule.xml 指定的ID範圍,在插入資料user_id的時候,不能超過這個範圍,否則分區無效,比如定義的ID範圍為:1-500000號
insert into zyalvin(user_id,user_name,user_address)values(‘5000001‘,‘user1‘,‘China‘);如果插入ID超過5000000,變成了 5000001的話那麼這個資料將同時寫到server1和server2 導致分區無效。
開啟以.xml結尾的檔案出現亂碼時,用以下方法處理:
Mysql企業實戰