發表文章

Percona TokuDB初試

圖片
◆ 緣起 最近在做個專案,它是一個報表系統 本來要用EDB(Postgres)但它的授權計算下來簡直是天價 所以又找了Greenplum要來做,測試後發現速度也無法滿足要求 最後想用MySQL的方案來試試。 ◆ 關於TokuDB 它的詳細說明,就不一一細數,有興趣直接到官網  Percona 簡單來說呢,是一個高效能、高壓縮比支援ACID和MVCC的儲存引擎,非常適合用在寫密集型且日誌型的應用場景。 在官方的部落中有做了一個 The MySQL Archive Storage Engine-Alternatives 對MyISAM、InnoDB、Archive和TokuDB的比較 在這些表中分別插入約2千萬筆的資料,其壓縮比如下: Engine Compression Table size [MB] InnoDB  none  2272 InnoDB  KEY_BLOCK_SIZE=8  1144 InnoDB  KEY_BLOCK_SIZE=4  584 MyISAM  none  1810 MyISAM  compressed with myisampack  809 Archive  default  211 TokuDB  ZLIB  284 TokuDB  LZMA   208 此表引用於Percona官方部落格 當然會有些限制內容,詳細就到官網上去看看 ◆ 安裝 手冊裡寫說可以單獨下載TokuDB的plugin,並安裝在MySQL或MariaDB的資料庫中,我這次是直接用Percona Server原生的資料庫,所以就包含在整個tar包裡了。 安裝前 記得有幾個設定要先處理,否則在啟動的時候會發生錯誤 libjemalloc library TokuDB需要libjemalloc 3.3.0以上的版本,如果是用tar包安裝的話,可以直接在lib/mysql/找到libjemalloc.so檔案,並且設定在my.cnf中: [mysqld_safe] malloc-lib=/opt/percona57/lib/...

MySQL InnoDB鎖定的那些事

Shared and Exclusive Locks InnoDB標準是使用row-level鎖定,其中又有分2種鎖定類別 shared(S) locks和exclusive(X) locks shared(S) lock允許交易持有讀取行的鎖 exclusive(X) lock允許交易持有更新或刪除行的鎖 如果今天有筆交易T1持有s鎖在資料行r,此時有另一個交易T2也要對資料行r進行鎖定時,情況如下: 如果T2也是使用S鎖定則可立即執行,此時T1和T2對資料行r同時擁有s鎖定。 如果T2是使用 X 鎖定,則無法立即執行 另外,如果今天T1持有X鎖在資料行r,此時T2要對資料行r進行S鎖或X鎖時,則無法立即執行,須等到T1解除鎖定行T2才能對資料行r進行鎖定。 Intention Locks InnoDB支援多粒度鎖定允許row-level鎖定和整表鎖定共存於同張資料表中,為實現多粒度鎖定會額外使用一稱為intention locks的鎖定,此意圖鎖在InnoDB資料表中為table-level lock,用來指示此交易在資料表中的某行之後會使用哪種類型的鎖定(Shared或Exclusive),它也有兩種鎖定類型: Intention shared (IS):交易T意圖在資料表a各別資料行上持有S鎖 Intention exclusive (IX):交易T意圖在某些資料行上持有X鎖 例如:SELECT ... LOCK IN SHARE MODE會設定IS鎖,SELECT ... FOR UPDATE設定IX鎖。 Intention Lock的協議如下: 一個交易在資料表a中的一資料行獲得S鎖之前,必須先取得a資料表的IS鎖或更強的鎖 一個交易在獲得一資料行的X鎖之前,必須先取得a資料表的IX鎖 總結如下表: X IX S IS X 衝突 衝突 衝突 衝突 IX 衝突 相容 衝突 相容 S 衝突 衝突 相容 相容 IS 衝突 相容 相容 相容 在相容的情況下允許在現有的鎖中被授予其他的鎖定,而衝突的情況下則需等待前一個鎖定釋放後,才能對此進行鎖定,否則會發生死鎖或錯誤。 因此,意圖鎖定不會阻止除全表請求任何東西(例如,LOCK TABLES... WRITE),其主要目的是...

MySQL Router 設定檔說明

設定檔範例:       [DEFAULT] logging_folder  = /opt/mysql-router/log plugin_folder   = /opt/mysql-router/lib/mysqlrouter runtime_folder  = /opt/mysql-router/run config_folder   = /opt/mysql-router [logger] level = INFO ## these section are only for standalone [routing:read_write] bind_address    = 192.168.56.107 bind_port       = 7001 destinations    = 192.168.56.102:3306,192.168.56.102:3307 mode            = read-write connect_timeout    = 5 max_connections   = 100 [routing:read_only] bind_address    = 192.168.56.107 bind_port       = 7002 destinations    = 192.168.56.102:3308,192.168.56.102:3309 mode            = read-only connect_timeout    = 1 max_connections   = 100 ## these section are used for Fabric [fabric_cache:my_fabric] address    = 192.168.56.101 user   ...

MySQL Fabric 安裝及配置

圖片
Fabric相關軟體需求 MySQL Server 5.6.17 or later Python2 (2.6 or later) Connector/Pythone 1.2.1 or later Connector/J 5.1.27 or later 安裝mysql fabric (utilities) TAR包安裝 (本次使用版本為mysql-utilities 1.6) unzip mysql-utilities-version.zip cd mysql-utilities-version python ./setup.py build python ./setup.py install RPM安裝 rpm -ivh mysql-utilities-version-el6.noarch.rpm 安裝和啟動資料庫(Backing store和user database) ((安裝過程不再贅述)) 建立使用者及設定權限 需要4種角色:Backing store user、Server user、 Backup and Restore user Backing store就是用在Fabric Server的那個資料庫,Server即使用者資料庫,我個人認為Backup和Restore可以使用同一個使用者即可 Backing Store User: CREATE USER 'fabric_store'@'localhost' IDENTIFIED BY 'password'; GRANT ALTER, CREATE, CREATE VIEW, DELETE, DROP, EVENT, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON fabric.* TO 'fabric_store'@'localhost'; Server User:(這個使用者在故障轉移時會用到) CREATE USER 'fabric_server'@'localhost' IDENTIFIED BY 'password'; GRANT DELETE, PROCESS, RELOAD, REPLICATION CLIEN...

MySQL Fabric 設定檔說明

fabric.cfg設定檔區塊說明: [default] #預設區塊,通常放安裝路徑的資訊 prefix =  /usr #安裝路徑,RPM裝的就指到/usr sysconfdir = /usr/etc #系統設定檔的位置,通常是在prefix下的etc中 logdir =   /var/log/fabric.log #log目錄 [storage] #Fabric backing store,存放fabric中所有群組設定的資料庫 address = 127.0.0.1:3306 #backing store的位置 user = password = database = #backing store的資料庫名稱,通常都會叫fabric auth_plugin = #connector連到backing store的驗證套件(可不使用) connection_timeout = #connector最大等待多少秒後會timeout connect_attempts = #重新連線的次數,超過這個次數就不會自動重新連 connection_delay = #多少秒重新連線一次 [servers] #被管理伺服器 user = password = backup_user = backup_password = restore_user = restore_password = unreachable_timeout = #用來檢查故障或新伺服器的timeout時間,預設是5,可設範圍1-60 [protocol.xmlrpc] #定議終端如何通過XML-RPC協定連線到Fabric節點 address = 127.0.0.1:32274 #XML-RPC伺服器,即connector連到Fabric的這段 threads = #連線數,這決定了Fabric並發請求的連線數 user = password = #如果這裡沒有設定密碼,在連線時會需要另外輸入密碼 disable_authentication = yes #是否不允許身份驗證 realm =MySQL Fabric #XML-RPC伺服器驗證時的識別碼 ssl_ca = #SSL認證機構路徑 ssl_cert =...

MySQL Cluster Replication With MySQL Cluster and non-NDB

圖片
環境介紹 因為筆電的空間和RAM有限,僅能在3台VM上來建置所有的場景    VM配置:   (3台環境資源配置均相同就不分開寫了)    hostname-> IP Address   ol65-> 192.168.56.101    ol65-cluster1->  192.168.56.103    ol65-cluster2-> 192.168.56.104 :   OS: Oracle Linux 6.5   RAM: 4G   mysql-5.6.19-ndb-7.3.6-cluster-commercial-advanced   mysql-5.6.21-enterprise-commercial-advanced (這只有在192.168.56.101)       第一座MySQL cluster:   mgm_node: 192.168.56.101:1186   data_node_1: 192.168.56.103:50501   data_node_2: 192.168.56.104:50502   sql_node_1: 192.168.56.103:3306   sql_node_2: 192.168.56.104:3306    第二座MySQL cluster:   slave_mgm: 192.168.56.101:1188   slave_data_1: 192.168.56.103:50503   slave_data_2: 192.168.56.104:50504   slave_sql_1: 192.168.56.103:3306   slave_sql_2: 192.168.56.104:3306    MySQL Server   slave: 192.168.56.101:3306 架構 MySQL Cluster Replication with MySQL Cluster MySQL Cluster Replication with non-NDB 前置設定 Table schema:   在Slave的mysql資料庫中新建此表,這個表是用來記...

MySQL PAM Plugin設定

圖片
安裝 在my.cnf中設定後重開: [mysqld] plugin-load=authentication_pam.so 在Linux中設定 在/etc/pam.d中新增一個文件,名稱與服務相同(若服務為mysql檔名就叫mysql,若叫mysqld就叫mysqld) vim /etc/pam.d/mysql #%PAM-1.0 auth include password-auth account include password-auth 使用PAM來登入MySQL 如果可以讓使用都屬在mysql的群組中,不行的話就要透過proxy來mapping使用者 mysql> create user 'wang'@'127.0.0.1' IDENTIFIED WITH authentication_pam as 'mysql';      ^^^後面as 'mysql'這個就是pam.d裡面設的那個檔案名稱 記得權限要另外設定 除錯 登入時一直出現ERROR 1045 (28000): Access denied for user 'wang'@'127.0.0.1' (using password: YES),在/var/log/security中記錄: Jun 18 19:23:31 ol65 unix_chkpwd[7097]: check pass; user unknown Jun 18 19:23:31 ol65 unix_chkpwd[7099]: check pass; user unknown Jun 18 19:23:31 ol65 unix_chkpwd[7099]: password check failed for user (wang) Jun 18 19:23:31 ol65 mysqld: pam_unix(mysql:auth): authentication failure; logname= uid=496 euid=496 tty= ruser=wang rhost=127.0.0.1 ...