本文分為兩大部分:第一部分詳細記錄 CentOS 環境下 MySQL 5.5 源碼編譯安裝的完整流程(依賴安裝、CMake 配置、目錄佈局、權限設定、服務註冊);第二部分介紹如何透過 UDF(用戶定義函數)結合 Trigger(觸發器),實現 MySQL 與 Memcached 的雙向自動同步,降低應用層快取維護複雜度。
yum install -y gcc gcc-c++ ncurses-devel perl
wget https://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz tar zxvf cmake-2.8.12.tar.gz && cd cmake-2.8.12 ./bootstrap && make && make install
wget https://ftp.gnu.org/gnu/bison/bison-3.0.2.tar.gz tar zxvf bison-3.0.2.tar.gz && cd bison-3.0.2 ./configure && make && make install
groupadd mysql && useradd -g mysql -r -s /sbin/nologin mysql
mkdir -p /data/mysql/{data,log}
chown -R mysql:mysql /data/mysql
wget https://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.24.tar.gz tar zxvf mysql-5.5.24.tar.gz && cd mysql-5.5.24 cmake \ -DCMAKE_INSTALL_PREFIX=/data/mysql \ -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/data/mysql/data \ -DMYSQL_TCP_PORT=3306 \ -DENABLE_DOWNLOADS=1 make && make install
chmod +w /data/mysql chown -R mysql:mysql /data/mysql ln -s /data/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18 ln -s /data/mysql/mysql.sock /tmp/mysql.sock
cp support-files/my-medium.cnf /etc/my.cnf cp support-files/mysql.server /etc/rc.d/init.d/mysqld /data/mysql/scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --basedir=/data/mysql --datadir=/data/mysql/data chmod +x /etc/init.d/mysqld # 編輯 /etc/init.d/mysqld 確認 basedir/datadir 路徑 chkconfig --add mysqld service mysqld start
/data/mysql/bin/mysqladmin -uroot -p password '強密碼' echo "export PATH=/data/mysql/bin:\$PATH" >> ~/.bash_profile source ~/.bash_profile
# libmemcached wget https://launchpad.net/libmemcached/1.0/0.34/+download/libmemcached-0.34.tar.gz yum install -y gcc44 gcc44-c++ libstdc++44-devel export CC=/usr/bin/gcc44 && export CXX=/usr/bin/g++44 ./configure --prefix=/soft/libmemcached --disable-64bit CFLAGS="-O3 -march=i686" --with-memcached=/root/libmemcached-1.0.7/memcached make && make install # memcached_functions_mysql (UDF) wget https://launchpad.net/memcached-udfs/trunk/1.1/+download/memcached_functions_mysql-1.1.tar.gz ./configure --prefix=/soft/UDFS/memcache_mysql \ --with-mysql=/soft/mysql/bin/mysql_config \ --libdir=/soft/mysql/lib/plugin \ --with-libmemcached=/soft/UDFS/libmemcached make && make install
mysql -uroot -pmysql < /sql/install_functions.sql mysql -uroot -pmysql -se "SELECT name, dl FROM mysql.func"
SELECT memc_servers_set('127.0.0.1:11211'); -- MySQL 重啟後需重新執行
SELECT memc_server_count();
SELECT memc_set('urls:sequence', 0);
-- 優化連線行為:非阻塞 + TCP_NODELAY
SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK', '1');
SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY', '1');
關鍵說明:啟用 NO_BLOCK 後,Memcached 故障時 MySQL 不會阻塞等待 timeout,直接寫入資料庫並記錄錯誤,保證核心業務可用性。
DROP TABLE IF EXISTS urls;
CREATE TABLE urls (
id INT(3) NOT NULL AUTO_INCREMENT,
url VARCHAR(64) NOT NULL DEFAULT '',
PRIMARY KEY (id)
);
DELIMITER |
-- INSERT 觸發器:分配自增 ID 並同步寫入快取
DROP TRIGGER IF EXISTS url_mem_insert |
CREATE TRIGGER url_mem_insert BEFORE INSERT ON urls
FOR EACH ROW BEGIN
SET NEW.id = memc_increment('urls:sequence');
SET @mm = memc_set(NEW.id, NEW.url);
END |
-- UPDATE 觸發器:更新快取
DROP TRIGGER IF EXISTS url_mem_update |
CREATE TRIGGER url_mem_update BEFORE UPDATE ON urls
FOR EACH ROW BEGIN
SET @mm = memc_replace(OLD.id, NEW.url);
END |
-- DELETE 觸發器:刪除快取
DROP TRIGGER IF EXISTS url_mem_delete |
CREATE TRIGGER url_mem_delete BEFORE DELETE ON urls
FOR EACH ROW BEGIN
SET @mm = memc_delete(OLD.id);
END |
DELIMITER ;
-- 插入測試
INSERT INTO urls (url) VALUES ('https://google.com'), ('https://lycos.com/'), ('https://tripod.com/');
SELECT * FROM urls;
SELECT memc_get('urls:1'), memc_get('urls:2'), memc_get('urls:3');
-- 更新測試
UPDATE urls SET url = 'https://mysql.com/sun' WHERE url = 'https://mysql.com';
SELECT memc_get('urls:6');
-- 刪除測試
DELETE FROM urls WHERE url = 'https://microsoft.com/';
SELECT memc_get('urls:4'); -- 應返回 NULL
plugin_dir 目錄(SHOW VARIABLES LIKE 'plugin_dir')memc_server_count() 確保連線正常