通过MySQL的UDFs和Trigger操作Memcached
通过MySQL 的UDFs 和Trigger 操作Memcached UDFs是User Defined Functions的缩写,表示MySQL的用户定义函数,应用程序可以利用这些函数从MySQL 5.0以上版本的数据库中访问Memcached写入或者获取的数据。此外,MySQL从5.1版本开始支持触发器,从而可以在触发
通过MySQL的UDFs和Trigger操作Memcached
UDFs是User Defined Functions的缩写,表示MySQL的用户定义函数,应用程序可以利用这些函数从MySQL 5.0以上版本的数据库中访问Memcached写入或者获取的数据。此外,MySQL从5.1版本开始支持触发器,从而可以在触发器中使用UDFs直接更新Memcached的内容,这种方式降低了应用程序设计和编写的复杂性。下面简单介绍UDFs的安装和使用。
UDFs安装
安装UDFs,需要依次安装MySQL、libevent、memcached、libmemcached、memcached_functions_sql。
1. 安装mysql-5.6.24.tar.gz
参照之前的博文《InnoDB memcached插件部署》中MySQL安装部分。
2. 安装libevent-2.0.22-stable.tar.gz和安装memcached-1.4.22.tar.gz
参照之前的博文《Memcached 1.4.22安装和配置》。
3. 安装libmemcached-0.34.tar.gz
memcached functions for mysql官网发布的1.1版本是09年的,只兼容libmemcached0.34版本。
mkdir -p /usr/local/libmemcached wget https://launchpad.net/libmemcached/1.0/0.34/+download/libmemcached-0.34.tar.gz tar zxvf libmemcached-0.34.tar.gz cd libmemcached-0.34 ./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/bin/memcached make make install
4. 安装memcached_functions_mysql
wget https://launchpad.net/memcached-udfs/trunk/1.1/+download/memcached_functions_mysql-1.1.tar.gz tar xvf memcached_functions_mysql-1.1.tar.gz cd memcached_functions_mysql-1.1 ./configure --prefix=/usr/local/memcache_mysql --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached make make install
5. 拷贝lib文件到mysql的plugin下面
cp /usr/local/memcache_mysql/lib/libmemcached_functions* /usr/local/mysql/lib/plugin
6. 配置动态链接库
echo "/usr/local/lib" >> /etc/ld.so.conf ldconfig
7. 添加memcache UDF 函数
mysql < ./sql/install_functions.sql
备注:
首次需要使用CREATE FUNCTION来初始化用户定义函数。有两种方法可以初始化所有MySQL提供的用户定义函数:
第一种方法是在MySQL的SQL命令行中执行memcached_functions_mysql源码目录下的sql/install_functions.sql。第二种方法是运行memcached_functions_mysql源码目录下的utils/install.pl这个Perl脚本,把memcache function作为UDFs加入MySQL。
8. 执行下面SQL命令,查看安装是否成功。
mysql> select name,dl from mysql.func; +------------------------------+---------------------------------+ | name | dl | +------------------------------+---------------------------------+ | memc_add | libmemcached_functions_mysql.so | | memc_add_by_key | libmemcached_functions_mysql.so | | memc_servers_set | libmemcached_functions_mysql.so | | memc_server_count | libmemcached_functions_mysql.so | | memc_set | libmemcached_functions_mysql.so | | memc_set_by_key | libmemcached_functions_mysql.so | | memc_cas | libmemcached_functions_mysql.so | | memc_cas_by_key | libmemcached_functions_mysql.so | | memc_get | libmemcached_functions_mysql.so | | memc_get_by_key | libmemcached_functions_mysql.so | | memc_get_cas | libmemcached_functions_mysql.so | | memc_get_cas_by_key | libmemcached_functions_mysql.so | | memc_delete | libmemcached_functions_mysql.so | | memc_delete_by_key | libmemcached_functions_mysql.so | | memc_append | libmemcached_functions_mysql.so | | memc_append_by_key | libmemcached_functions_mysql.so | | memc_prepend | libmemcached_functions_mysql.so | | memc_prepend_by_key | libmemcached_functions_mysql.so | | memc_increment | libmemcached_functions_mysql.so | | memc_decrement | libmemcached_functions_mysql.so | | memc_replace | libmemcached_functions_mysql.so | | memc_replace_by_key | libmemcached_functions_mysql.so | | memc_servers_behavior_set | libmemcached_functions_mysql.so | | memc_servers_behavior_get | libmemcached_functions_mysql.so | | memc_behavior_set | libmemcached_functions_mysql.so | | memc_behavior_get | libmemcached_functions_mysql.so | | memc_list_behaviors | libmemcached_functions_mysql.so | | memc_list_hash_types | libmemcached_functions_mysql.so | | memc_list_distribution_types | libmemcached_functions_mysql.so | | memc_udf_version | libmemcached_functions_mysql.so | | memc_libmemcached_version | libmemcached_functions_mysql.so | | memc_stats | libmemcached_functions_mysql.so | | memc_stat_get_keys | libmemcached_functions_mysql.so | | memc_stat_get_value | libmemcached_functions_mysql.so | +------------------------------+---------------------------------+ 34 rows in set (0.00 sec)
使用Trigger操作Memcached
1. 创建两张表
新建两张表:urls和results,更新urls表中的内容,使系统自动更新Memcached的内容。results用来记录更新Memcached失败的记录。
SQL代码如下:
use test; drop table if exists urls; CREATE TABLE `urls` ( `id` int(10) NOT NULL, `url` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ); drop table if exists results; CREATE TABLE `results` ( `id` int(10) NOT NULL, `result` varchar(255) NOT NULL DEFAULT 'error', `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) );
2. 建立3个trigger
当向urls表中插入数据时,对Memcached执行set操作。trigger的代码如下:
DELIMITER // DROP TRIGGER IF EXISTS url_mem_insert; CREATE TRIGGER url_mem_insert BEFORE INSERT ON urls FOR EACH ROW BEGIN set @mm = memc_set(NEW.id, NEW.url); if @mm <> 0 then insert into results(id) values(NEW.id); end if; END // DELIMITER ;
当对urls表中的数据进行更新时,对Memcached执行replace操作。trigger代码如下:
DELIMITER // 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); if @mm <> 0 then insert into results(id) values(OLD.id); end if; END // DELIMITER ;
当对urls表中的数据进行删除操作时,对Memcached执行delete操作。trigger代码如下:
DELIMITER // 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); if @mm <> 0 then insert into results(id) values(OLD.id); end if; END // DELIMITER ;
3. 设置Memcached相关参数
设置UDFs操作Memcaced服务器的IP地址和端口。
mysql> SELECT memc_servers_set('192.168.11.52:11211'); +-----------------------------------------+ | memc_servers_set('192.168.11.52:11211') | +-----------------------------------------+ | 0 | +-----------------------------------------+ 1 row in set (0.07 sec) mysql>select memc_server_count(); +---------------------+ | memc_server_count() | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec)
在MySQL命令行中列出可以修改Memcached参数的行为,执行的命令和输出结果如下:
mysql>select memc_list_behaviors()\G *************************** 1. row *************************** memc_list_behaviors(): MEMCACHED SERVER BEHAVIORS MEMCACHED_BEHAVIOR_SUPPORT_CAS MEMCACHED_BEHAVIOR_NO_BLOCK MEMCACHED_BEHAVIOR_TCP_NODELAY MEMCACHED_BEHAVIOR_HASH MEMCACHED_BEHAVIOR_CACHE_LOOKUPS MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE MEMCACHED_BEHAVIOR_BUFFER_REQUESTS MEMCACHED_BEHAVIOR_KETAMA MEMCACHED_BEHAVIOR_POLL_TIMEOUT MEMCACHED_BEHAVIOR_RETRY_TIMEOUT MEMCACHED_BEHAVIOR_DISTRIBUTION MEMCACHED_BEHAVIOR_BUFFER_REQUESTS MEMCACHED_BEHAVIOR_USER_DATA MEMCACHED_BEHAVIOR_SORT_HOSTS MEMCACHED_BEHAVIOR_VERIFY_KEY MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED MEMCACHED_BEHAVIOR_KETAMA_HASH MEMCACHED_BEHAVIOR_BINARY_PROTOCOL MEMCACHED_BEHAVIOR_SND_TIMEOUT MEMCACHED_BEHAVIOR_RCV_TIMEOUT MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK 1 row in set (0.00 sec)
设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在Memcached出现问题(不能连接)时,数据可以继续插入MySQL中,但有报错提示;如果不设置此值,那么Memcached失败时,数据需要等到Memcached失败超时后才可以插入到表中。
通过下面的设置,可以避免这种情况的发生。
mysql>select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1'); +--------------------------------------------------------------+ | memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') | +--------------------------------------------------------------+ | 0 | +--------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1'); +-----------------------------------------------------------------+ | memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') | +-----------------------------------------------------------------+ | 0 | +-----------------------------------------------------------------+ 1 row in set (0.00 sec)
4. 对memcached_functions_mysql的简单功能进行测试
1)向表urls中插入数据,然后查看Memcached是否对数据执行set操作。
mysql>insert into urls (id,url) values (1, 'http://www.test.com.cn'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select memc_get('1'); +------------------------+ | memc_get('1') | +------------------------+ | http://www.test.com | +------------------------+ 1 row in set (0.00 sec)
1>telnet 192.168.11.52 11211 Trying 192.168.11.52... Connected to 192.168.11.52 (192.168.11.52). Escape character is '^]'. get 1 VALUE 1 0 22 http://www.test.com.cn END
2)更新表urls里面的数据,然后查询Memcached中是否也进行了更新。
mysql>update test.urls set url='http://blog.test.com.cn' where id=1; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select memc_replace('1','http://blog.test.com.cn'); +---------------------------------------------+ | memc_replace('1','http://blog.test.com.cn') | +---------------------------------------------+ | 0 | +---------------------------------------------+ 1 row in set (0.00 sec) mysql> select memc_get('1'); +-------------------------+ | memc_get('1') | +-------------------------+ | http://blog.test.com.cn | +-------------------------+ 1 row in set (0.00 sec)
1>telnet 192.168.11.52 11211 Trying 192.168.11.52... Connected to 192.168.11.52(192.168.11.52). Escape character is '^]'. get 1 VALUE 1 0 23 http://blog.test.com.cn END
3)删除表urls中的数据,然后查看Memcached是否也将该数据删除了。
mysql>delete from test.urls where id=1; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select memc_get('1'); +---------------+ | memc_get('1') | +---------------+ | NULL | +---------------+ 1 row in set (0.00 sec)
1>telnet 192.168.11.52 11211 Trying 192.168.11.52... Connected to 192.168.11.52 (192.168.11.52). Escape character is '^]'. get 1 END
5. 使用memcached_functions_mysql的经验与技巧
memcached_functions_mysql使用起来比较简单,但是由于环境的差别,在实践过程中可能会遇到诸多的问题。下面总结了一些在使用memcached_functions_mysq过程中可能出现的问题和注意事项。
1) MySQL重启问题
如果MySQL服务器出现重启,需要重新设置连接Memcached关系(SELECT memc_servers_set('192.168.11.52:11211'))。
2) 程序BUG问题
memcached_functions_mysql的源程序有可能存在bug,并且会导致MySQL的失败。针对这个问题,读者要尽量选择源程序的稳定版本。
3) 网络因素
网络因素是指MySQL和Memcached是否处在同一个IDC、它们之间的网络性能是否很好。网络性能越好,则速度越快。使用本机的Memcached可以适当减少网络开销。
4) 插入的数据量
插入数据量的大小包含两个方面:向MySQL插入每条记录的大小,向Memcached中更新数据的大小。更新MySQL、Memcached的数据越大,更新的速度越慢。因此,要做好前期规划。
5) 延时问题
如果MySQL所在的机器使用的资源比较大,会导致更新Memcached过于缓慢,即出现类似m/s的延时问题。
6) 容灾问题
如果MySQL和Memcached中有宕机情况出现时,需要考虑怎么恢复,根据前一小节的测试可以这样考虑:建一张错误表,如果在更新mc时出现问题,自动把更新错误的记录插到这张表中,通过查询这张表,可以知道哪些数据在什么时间出现过更新错误。
如果memcached_functions_mysql应用于生产环境,需要考虑监控和出现问题时的恢复工作(写好脚本以完善这个工作)。
7) MySQL自身因素
如执行的MySQL语句的效率以及连接MySQL的client程序(php)的连接开销等,这些问题都需要考虑。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



Traiter efficacement 7 millions d'enregistrements et créer des cartes interactives avec la technologie géospatiale. Cet article explore comment traiter efficacement plus de 7 millions d'enregistrements en utilisant Laravel et MySQL et les convertir en visualisations de cartes interactives. Exigences initiales du projet de défi: extraire des informations précieuses en utilisant 7 millions d'enregistrements dans la base de données MySQL. Beaucoup de gens considèrent d'abord les langages de programmation, mais ignorent la base de données elle-même: peut-il répondre aux besoins? La migration des données ou l'ajustement structurel est-il requis? MySQL peut-il résister à une charge de données aussi importante? Analyse préliminaire: les filtres et les propriétés clés doivent être identifiés. Après analyse, il a été constaté que seuls quelques attributs étaient liés à la solution. Nous avons vérifié la faisabilité du filtre et établi certaines restrictions pour optimiser la recherche. Recherche de cartes basée sur la ville

Les ingénieurs DevOps sont souvent confrontés aux défis de l'optimisation et de la mise à jour de la base de données RDS, en particulier dans les situations de charge élevée, où les méthodes traditionnelles sont sujettes au risque de temps d'arrêt. Cet article présente la stratégie de déploiement AWS Blue / Green pour obtenir une mise à jour de la base de données RDS zéro à la base de données RDS. Dites au revoir au cauchemar de la mise à jour de mise à jour de la base de données! Cet article expliquera en détail la stratégie de déploiement bleu / vert et fournira des étapes opérationnelles dans l'environnement AWS pour vous aider à mettre à jour l'instance de base de données RDS sans affecter la disponibilité du service. Préparation D'abord, coordonner l'équipe de développement et sélectionner la période avec le trafic de charge de travail le plus bas pour les mises à jour. De bons conseils pratiques pour informer l'équipe à l'avance. Cet exemple montre comment réduire l'espace de stockage des instances de base de données avec un temps d'arrêt nul à l'aide du déploiement bleu / vert. Vous pouvez utiliser la console AWSRDS

MySQL peut s'exécuter sans connexions réseau pour le stockage et la gestion des données de base. Cependant, la connexion réseau est requise pour l'interaction avec d'autres systèmes, l'accès à distance ou l'utilisation de fonctionnalités avancées telles que la réplication et le clustering. De plus, les mesures de sécurité (telles que les pare-feu), l'optimisation des performances (choisissez la bonne connexion réseau) et la sauvegarde des données sont essentielles pour se connecter à Internet.

Il existe de nombreuses raisons pour lesquelles la startup MySQL échoue, et elle peut être diagnostiquée en vérifiant le journal des erreurs. Les causes courantes incluent les conflits de port (vérifier l'occupation du port et la configuration de modification), les problèmes d'autorisation (vérifier le service exécutant les autorisations des utilisateurs), les erreurs de fichier de configuration (vérifier les paramètres des paramètres), la corruption du répertoire de données (restaurer les données ou reconstruire l'espace de la table), les problèmes d'espace de la table InNODB (vérifier les fichiers IBDATA1), la défaillance du chargement du plug-in (vérification du journal des erreurs). Lors de la résolution de problèmes, vous devez les analyser en fonction du journal d'erreur, trouver la cause profonde du problème et développer l'habitude de sauvegarder régulièrement les données pour prévenir et résoudre des problèmes.

MySQL utilise des verrous partagés et des verrous exclusifs pour gérer la concurrence, fournissant trois types de verrouillage: verrous de table, verrous en ligne et verrous de page. Les verrous en ligne peuvent améliorer la concurrence et utiliser l'instruction pour la mise à jour pour ajouter des verrous exclusifs aux lignes. Les verrous pessimistes supposent des conflits et les verrous optimistes jugent les données via le numéro de version. Les problèmes de table de verrouillage communs se manifestent comme une requête lente, utilisez la commande show processList pour afficher les requêtes maintenues par la serrure. Les mesures d'optimisation incluent la sélection des indices appropriés, la réduction de la portée des transactions, les opérations par lots et l'optimisation des instructions SQL.

Dans les opérations de la base de données MySQL, le traitement des chaînes est un lien inévitable. La fonction substring_index est conçue pour cela, qui peut extraire efficacement les sous-chaînes en fonction des séparateurs. Exemple d'application de fonction substring_index L'exemple suivant montre la flexibilité et la praticité de la fonction substring_index: extraire des pièces spécifiques de l'URL par exemple, extraire le nom de domaine: selectSubString_index ('www.mysql.com' ','. ', 2); Extraire l'extension de fichier pour obtenir facilement l'extension du fichier: selectSubString_index ('file.pdf', '.', - 1); Le traitement n'existe pas

Pour les environnements de production, un serveur est généralement nécessaire pour exécuter MySQL, pour des raisons, notamment les performances, la fiabilité, la sécurité et l'évolutivité. Les serveurs ont généralement un matériel plus puissant, des configurations redondantes et des mesures de sécurité plus strictes. Pour les petites applications à faible charge, MySQL peut être exécutée sur des machines locales, mais la consommation de ressources, les risques de sécurité et les coûts de maintenance doivent être soigneusement pris en considération. Pour une plus grande fiabilité et sécurité, MySQL doit être déployé sur le cloud ou d'autres serveurs. Le choix de la configuration du serveur approprié nécessite une évaluation en fonction de la charge d'application et du volume de données.

MySQL et MARIADB peuvent coexister, mais doivent être configurés avec prudence. La clé consiste à allouer différents numéros de port et répertoires de données à chaque base de données et ajuster les paramètres tels que l'allocation de mémoire et la taille du cache. La mise en commun de la connexion, la configuration des applications et les différences de version doivent également être prises en compte et doivent être soigneusement testées et planifiées pour éviter les pièges. L'exécution de deux bases de données simultanément peut entraîner des problèmes de performances dans les situations où les ressources sont limitées.
