文檔結構:html
如下前言來自網絡node
這裏說的運維,指:sql
舉個例子,假如項目一開始設計的用戶表以下:數據庫
id bigint #用戶的ID安全
name varchar #用戶的名字bash
last_login_time datetime #最近登陸時間服務器
personal_info text #私人信息網絡
….. #其餘信息字段session
在項目初始階段,這種設計是知足簡單的業務需求的,也方便快速迭代開發。而當業務快速發展時,用戶量從10w激增到10億,用戶很是的活躍,每次登陸會更新 last_login_name 字段,使得 user 表被不斷update,壓力很大。而其餘字段:id, name, personal_info 是不變的或不多更新的,此時在業務角度,就要將 last_login_time 拆分出去,新建一個 user_time 表。架構
personal_info 屬性是更新和查詢頻率較低的,而且text字段佔據了太多的空間。這時候,就要對此垂直拆分出 user_ext 表了。
雞蛋不要放在一個籃子裏。在業務層面上垂直切分,將不相關的業務的數據庫分隔,由於每一個業務的數據量、訪問量都不一樣,不能由於一個業務把數據庫搞掛而牽連到其餘業務。利用水平切分,當一個數據庫出現問題時,不會影響到100%的用戶,每一個庫只承擔業務的一部分數據,這樣總體的可用性就能提升。
隨着數據量的增長,經過輔助索引查找的數據愈來愈多,大部分是須要進行回表操做,不能直接經過輔助索引找到數據,當數據量很是大時,回表查找將會消耗大量的時間,因爲Oracle,MySQL,Postgresql查詢優化器是基於cost代價模型來設計的,當查詢返回值大於必定比例,執行優化器會選擇走全表掃描
Citus可以橫向擴展多租戶(b2b)數據庫,或者構建實時應用程序。citus使用分片,複製,查詢並行化擴展postgres跨服務器來實現這一點,它是之前 pg_shard的升級版本。
Citus適用兩種應用場景,這兩種應用場景對應兩種數據模型:對租戶對應程序和實時分析
多租戶適用於B2B應用場景。
有關蘇寧易購的citus:
IP |
操做系統 |
端口 |
Citus版本 |
192.168.10.41 /master |
CentOS release 6.10 |
5432 |
7.2 |
192.168.10.51 /woker |
CentOS release 6.10 |
5433 |
7.2 |
192.168.10.61 /woker |
CentOS release 6.10 |
5434 |
7.2 |
步驟在全部節點上執行(我是root身份執行的)
curl https://install.citusdata.com/community/rpm.sh | sudo bash
yum install -y citus72_10
##yum install -y citus83_11 (我安裝10的版本)
配置postgres環境變量
集羣官方網站來自:
https://docs.citusdata.com/en/stable/installation/multi_machine_rhel.html
單機:https://docs.citusdata.com/en/stable/installation/single_machine_rhel.html
如下是三臺都須要操做的步驟
實例初始化:
service postgresql-10 initdb || sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
修改vi /var/lib/pgsql/10/data/postgresql.conf配置,加入如下內容:
shared_preload_libraries='citus'
若是又多個shared_proload_librarues,shared_preload_libraries='citus'排在第一。
修改其餘參數,好比監聽參數。
而且修改pg_hba.conf 參數(加入如下)。
hostnossl all all 0.0.0.0/0 trust
啓動postgres-10
service postgresql-10 start
chkconfig postgresql-10 on
配置環境變量:
export PATH=/usr/pgsql-10/bin:$PATH:
查看安裝的數據庫:
psql -p5432
create extension citus;
select * from pg_extension ;
SELECT * from master_add_node('192.168.10.51',5433);
SELECT * from master_add_node('192.168.10.61',5434);
查看添加的節點:
SELECT * FROM master_get_active_worker_nodes();
若是須要時刪除節點:
好比說刪除61 5434:
SELECT * from master_remove_node('192.168.10.61',5434);
查看:
已經刪除了,只剩一個了。
禁用某個節點:
select master_disable_node('192.168.10.51',5433);
只看導5434端口的節點了,5433的沒有活動。
從新啓用節點:
select master_activate_node('192.168.10.51',5433);
創建分佈式表:
注意,cutis不可以建立數據庫:
create database test; 須要全部節點建立數據庫
create extension citus; 而且數據庫建立插件
主節點上操做:
create table test(id int, name varchar(16));
查看默認分片數:
show citus.shard_count;
默認分片數是32,默認是採用hash mod 的分佈方式,能夠根絕實際狀況進行調整,查了不少資料,官方建議OLTP場景(帶分片字段SQL)小負載(小於100GB)32;大負載64或128;我的比較贊同的是:cpu核數*物理節點的分片數*物理節點數
將表test 分片(主庫)
SELECT master_create_distributed_table('test', 'id', 'hash');
設定分片個數(2)以及每一個分片副本數(2)
SELECT master_create_worker_shards('test', 2, 2);
執行完後查看節點表:
主節點:
能夠看出來,數據所有再子節點
節點2:
節點3:
好比我插入10條數據:
主節點
insert into test select *,'a' from generate_series(1,10);
發現工做節點兩便都是:
insert into test select id+10,name from test;
建索引:
子節點:
查看試圖:
有關參數,大多數的經常使用的都是
pg_dist_ 前綴的參數。
查看元數據的幾個試圖:
pg_dist_partition
pg_dist_shard
pg_dist_shard_placement
參數:
set citus.enable_repartition_joins = on
這個能夠開啓,開啓分片表的親和,能夠優化設計奪標的sql和事務,也支持sql下推。
「Citus Maintenance Daemon」進程自動檢測和處理分佈式死鎖。
citus.shard_replication_factor 分片的副本,默認值1
citus.shard_count 分偏數量 默認值32
citus.task_executor_type 它值爲real-time 和task-tracker,默認爲real-time,在跨多個分片的聚合和共同定位鏈接的查詢性能最好。
idle_in_transaction_session_timeout 未防止鏈接資源被耗盡,能夠進行設置事務鏈接時間,默認毫秒。
查看根據對應的分零篇鍵值,查找分片:
select get_shard_id_for_distribution_column('t',100);
Id=100的值分片爲t_102018
查看建立分片函數:
create_distributed_table
若是主節點服務器壞點怎麼處理?
哈哈,這個最開始架構選取的時候,就應該設置主備模式,利用VIP,主節點的citus換掉了,備節點接管服務。
其餘節點點服務器down掉
模擬 51節點down 掉,主節點有數據進行插入。
插入數據的時候,有提示51上異常,可是仍是插入成功了。
起來以後,查看分片的狀況:
SELECT * from pg_dist_shard_placement order by shardid, placementid;
明顯應該都是1的,直接把節點2,102008,102009 這兩個從新同步一下
主節點執行:
把節點3的數據拷貝導節點2,主節點執行:
SELECT master_copy_shard_placement(102008, '192.168.10.61', 5434, '192.168.10.51', 5433);
SELECT master_copy_shard_placement(102009, '192.168.10.61', 5434, '192.168.10.51', 5433);
子節點:
主節點:
已經同步正常。
原文出處:https://www.cnblogs.com/hmwh/p/11651333.html