±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÍøÂ磬
±¾ÎÄÖ÷Òª´Ó¿ÉÓÃÐÔ¡¢¿É¿¿ÐÔ¡¢¿É¿ØÐÔ¡¢¼à¿ØÈ۶ϵȽǶÈ×öµÄ¼Ü¹¹Éè¼ÆÓë¿ò¼ÜÉè¼Æ£¬·ÖÏíµÄ²úÆ·Ñз¢Ë¼Â·¡£ |
|
±³¾°
½üÄêÀ´£¬»¥ÁªÍøÉϰ²È«Ê¼þƵ·¢£¬ÆóÒµÐÅÏ¢°²È«Ô½À´Ô½Êܵ½ÖØÊÓ£¬¶øIDC·þÎñÆ÷°²È«ÓÖÊÇ×ÝÉî·ÀÓùÌåϵÖеÄÖØÒªÒ»»·¡£±£ÕÏIDC°²È«£¬³£ÓõÄÊÇ»ùÓÚÖ÷»úÐÍÈëÇÖ¼ì²âϵͳHost-based
Intrusion Detection System£¬¼´HIDS¡£ÔÚHIDSÃæ¶Ô¼¸Ê®Íǫ̀ÉõÖÁÉϰÙÍǫ̀¹æÄ£µÄIDC»·¾³Ê±£¬ÏµÍ³¼Ü¹¹¸ÃÈçºÎÉè¼ÆÄØ£¿¸´ÔӵķþÎñÆ÷»·¾³£¬ÍøÂç»·¾³£¬¾Þ´óµÄÊý¾ÝÁ¿¸øÎÒÃÇ´øÀ´ÁËÄÄЩ¼¼ÊõÌôսĨ£¿
ÐèÇóÃèÊö
¶ÔÓÚHIDS²úÆ·£¬ÎÒÃǰ²È«²¿ÃŵIJúÆ·¾ÀíÌá³öÁËÒÔÏÂÐèÇó£º
1.Âú×ã50W-100W·þÎñÆ÷Á¿¼¶µÄIDC¹æÄ£¡£
2.²¿ÊðÔڸ߲¢·¢·þÎñÆ÷Éú²ú»·¾³£¬ÒªÇóAgentµÍÐÔÄܵÍËðºÄ¡£
3.¹ã·ºµÄ²¿Êð¼æÈÝÐÔ¡£
4.Æ«ÏòÓ¦ÓòãºÍÓû§Ì¬ÈëÇÖ¼ì²â£¨¿ÉÒÔºÍÄÚºË̬¼ì²â²¿·Ö½âñ¡£
5.Õë¶ÔÀûÓÃÖ÷»úAgentÅŲé©¶´µÄ×î¼±Ð賡¾°Ìṩ»ù±¾µÄÄÜÁ¦£¬¿ÉÒÔʵÏÖº£Á¿»·¾³Ï¿ìËÙ²éÕÒϵͳ©¶´¡£
6.Agent¸úServerµÄÅäÖÃÏ·¢Í¨µÀ°²È«¡£
7.ÅäÖÃÐÅÏ¢¶ÁȡдÈëÐèÒª¼øÈ¨¡£
8.ÅäÖñä¸üÀúÊ·¼Ç¼¡£
9.Agent²å¼þ¾ß±¸×Ô¸üй¦ÄÜ¡£
·ÖÎöÐèÇó
Ê×ÏÈ£¬·þÎñÆ÷ÒµÎñ½ø³ÌÓÅÏȼ¶¸ß£¬HIDS Agent½ø³Ì×Ô¼º¿ÉÒÔÖÕÖ¹£¬µ«²»ÄÜÓ°ÏìËÞÖ÷»úµÄÖ÷ÒªÒµÎñ£¬ÕâÊǵÚÒ»Òªµã£¬ÄÇôҵÎñÐèÒª¾ß±¸È۶Ϲ¦ÄÜ£¬²¢¾ß±¸×ÔÎÒ»Ö¸´ÄÜÁ¦¡£
Æä´Î£¬½ø³Ì±£»î¡¢Î¬³ÖÐÄÌø¡¢ÊµÊ±»ñÈ¡ÐÂÖ¸ÁîÄÜÁ¦£¬°ÙÍǫ̀AgentµÄÈ«Á¿¿ØÖÆÊ±¼äÒ»¶¨Òª¶Ì¡£¾Ù¸ö¼«¶ËµÄÀý×Ó£¬µ±Agent³öÏÖ½ô¼±Çé¿ö£¬ÐèҪȫÁ¿Í£Ö¹Ê±£¬ÄÇôȫÁ¿Í£Ö¹µÄÃüÁîÏ·¢£¬ÐèÒªÔÚ1-2·ÖÖÓÄÚÍê³É£¬ÉõÖÁ30Ãë¡¢20ÃëÄÚÍê³É¡£ÕâЩ½«»áÊǺܴóµÄ¼¼ÊõÌôÕ½¡£
»¹ÓжÔÅäÖö¯Ì¬¸üУ¬ÈÕÖ¾¼¶±ð¿ØÖÆ£¬Ï¸·Ö¾«È·¿ØÖƵ½Ã¿¸öAgentÉϵÄÿ¸öHIDS×Ó½ø³Ì£¬ÄÜ×ÔÓɵؿØÖÆÃ¿¸ö½ø³ÌµÄÆôÍ££¬Ã¿¸öAgentµÄ²ÎÊý£¬Ò²Äܾ«È·µÄ¸Ð֪ÿ̨AgentµÄÉÏÏß¡¢ÏÂÏßÇé¿ö¡£
ͬʱ£¬Agent±¾ÉíÊǰ²È«Agent£¬°²È«µÄÒòËØÒ²Òª¿¼ÂǽøÈ¥£¬°üÀ¨Í¨ÐÅͨµÀµÄ°²È«ÐÔ£¬ÅäÖùÜÀíµÄ°²È«ÐԵȵȡ£
×îºó£¬·þÎñ¶ËÒ²ÒªÓÐÒ»ÖÂÐÔ±£ÕÏ¡¢¿ÉÓÃÐÔ±£ÕÏ£¬¶ÔÓÚ´óÁ¿AgentµÄ¹ÜÀí£¬±ØÐëÄÜʵÏÖÈÎÎñ·Ö̯£¬²¢Ðд¦ÀíÈÎÎñ£¬ÇÒ±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ¡£¿¼Âǵ½¹«Ë¾¹æÄ£²»¶ÏµØÀ©´ó£¬ÒµÎñ²»¶ÏµØÔö¶à£¬ÌرðÊÇÃÀÍźʹóÖÚµãÆÀºÏ²¢ºó£¬Ãæ¶ÔµÄ¸÷ÖÖ²Ù×÷ϵͳÎÊÌ⣬²úÆ·»¹Òª¾ß±¸Á¼ºÃµÄ¼æÈÝÐÔ¡¢¿Éά»¤ÐԵȡ£
×ܽáÏÂÀ´£¬²úÆ·¼Ü¹¹Òª·ûºÏÒÔÏÂÌØÐÔ£º
1.¼¯Èº¸ß¿ÉÓá£
2.·Ö²¼Ê½£¬È¥ÖÐÐÄ»¯¡£
3.ÅäÖÃÒ»ÖÂÐÔ£¬ÅäÖÃ¶à°æ±¾¿É×·ËÝ¡£
4.·ÖÖÎÓë»ã×Ü¡£
5.¼æÈݲ¿Êð¸÷ÖÖLinux ·þÎñÆ÷£¬Ö»Î¬»¤Ò»¸ö°æ±¾¡£
6.½ÚÊ¡×ÊÔ´£¬Õ¼ÓýÏÉÙµÄCPU¡¢ÄÚ´æ¡£
7.¾«È·µÄÈÛ¶ÏÏÞÁ÷¡£
8.·þÎñÆ÷ÊýÁ¿¹æÄ£´ïµ½°ÙÍò¼¶µÄ¼¯Èº¸ºÔØÄÜÁ¦¡£
¼¼ÊõÄѵã
ÔÚÁгö²úÆ·ÐèҪʵÏֵŦÄܵ㡢¼¼Êõµãºó£¬ÔÙÀ´·ÖÎöÏÂÓöµ½µÄ¼¼ÊõÌôÕ½£¬°üÀ¨²»ÏÞÓÚÒÔϼ¸µã£º
1.×ÊÔ´ÏÞÖÆ£¬½ÏСµÄCPU¡¢ÄÚ´æ¡£
2.ÎåÊ®ÍòÉõÖÁÒ»°ÙÍǫ̀·þÎñÆ÷µÄAgent´¦Àí¿ØÖÆÎÊÌâ¡£
3.Á¿¼¶´óÁ˺󣬼¯Èº¿ØÖÆ´øÀ´µÄ¿ØÖÆÐ§ÂÊ£¬ÏìÓ¦ÑÓ³Ù£¬Êý¾ÝÒ»ÖÂÐÔÎÊÌâ¡£
4.Á¿¼¶´óÁ˺ó£¬Êý¾Ý´«Êä¶ÔÕû¸ö·þÎñÆ÷ÄÚÍø´øÀ´µÄÁ÷Á¿³å»÷ÎÊÌâ¡£
5.Á¿¼¶´óÁ˺ó£¬ÔËÐл·¾³¸ü¸´ÔÓ£¬AgentÒì³£±íÏֵĸÐÖªÎÊÌâ¡£
6.Á¿¼¶´óÁ˺ó£¬ÒµÎñÈÕÖ¾¡¢³ÌÐòÔËÐÐÈÕÖ¾µÄ´«Êä¡¢´æ´¢ÎÊÌ⣬±»¼à¿ØÒµÎñ·ÃÎÊÁ¿Í»Ôö´øÀ´¼à¿ØÊý¾ÝÁª¶¯Í»Ôö£¬¶ÔÄÚÍø´ø¿í£¬´æ´¢¼¯ÈºµÄ±¬·¢Ñ¹Á¦ÎÊÌâ¡£
ÎÒÃÇ¿ÉÒÔ¿´µ½£¬¼¼ÊõÄѵ㼸ºõ¶¼ÊÇ·þÎñÆ÷µ½´ïÒ»¶¨Á¿¼¶´øÀ´µÄ£¬¶ÔÓÚ´óÁ¿µÄ·þÎñ£¬¼¯Èº·Ö²¼Ê½ÊÇÒµ½ç³£¼ûµÄ½â¾ö·½°¸¡£
¼Ü¹¹Éè¼ÆÓë¼¼ÊõÑ¡ÐÍ
¶ÔÓÚ¹ÜÀíAgentµÄ·þÎñ¶ËÀ´Ëµ£¬ÒªÊµÏָ߿ÉÓá¢ÈÝÔÖÉè¼Æ£¬ÄÇôһ¶¨Òª×ö¶à»ú·¿²¿Ê𣬾ÍÒ»¶¨»áÓöµ½Êý¾ÝÒ»ÖÂÐÔÎÊÌâ¡£ÄÇôÊý¾ÝµÄ´æ´¢£¬¾ÍÒª¿¼ÂÇ·Ö²¼Ê½´æ´¢×é¼þ¡£
·Ö²¼Ê½Êý¾Ý´æ´¢ÖУ¬´æÔÚÒ»¸ö¶¨Àí½ÐCAP¶¨Àí£º

CAPµÄ½âÊÍ
¹ØÓÚCAP¶¨Àí£¬·ÖΪÒÔÏÂÈýµã£º
1.Ò»ÖÂÐÔ£¨Consistency£©£º·Ö²¼Ê½Êý¾Ý¿âµÄÊý¾Ý±£³ÖÒ»Ö¡£
2.¿ÉÓÃÐÔ£¨Availability£©£ºÈκÎÒ»¸ö½Úµãå´»ú£¬ÆäËû½Úµã¿ÉÒÔ¼ÌÐø¶ÔÍâÌṩ·þÎñ¡£
3.·ÖÇøÈÝ´íÐÔ£¨ÍøÂç·ÖÇø£©Partition Tolerance£ºÒ»¸öÊý¾Ý¿âËùÔڵĻúÆ÷»µÁË£¬ÈçÓ²ÅÌ»µÁË£¬Êý¾Ý¶ªÊ§ÁË£¬¿ÉÒÔÌí¼Óһ̨»úÆ÷£¬È»ºó´ÓÆäËûÕý³£µÄ»úÆ÷°Ñ±¸·ÝµÄÊý¾Ýͬ²½¹ýÀ´¡£
¸ù¾Ý¶¨Àí£¬·Ö²¼Ê½ÏµÍ³Ö»ÄÜÂú×ãÈýÏîÖеÄÁ½Ïî¶ø²»¿ÉÄÜÂú×ãÈ«²¿ÈýÏî¡£Àí½âCAP¶¨ÀíµÄ×î¼òµ¥·½Ê½ÊÇÏëÏóÁ½¸ö½Úµã·Ö´¦·ÖÇøÁ½²à¡£ÔÊÐíÖÁÉÙÒ»¸ö½Úµã¸üÐÂ״̬»áµ¼ÖÂÊý¾Ý²»Ò»Ö£¬¼´É¥Ê§ÁËConsistency¡£Èç¹ûΪÁ˱£Ö¤Êý¾ÝÒ»ÖÂÐÔ£¬½«·ÖÇøÒ»²àµÄ½ÚµãÉèÖÃΪ²»¿ÉÓã¬ÄÇôÓÖɥʧÁËAvailability¡£³ý·ÇÁ½¸ö½Úµã¿ÉÒÔ»¥ÏàͨÐÅ£¬²ÅÄܼȱ£Ö¤ConsistencyÓÖ±£Ö¤Availability£¬ÕâÓֻᵼÖÂɥʧPartition
Tolerance¡£
CAPµÄÑ¡Ôñ
ΪÁËÈÝÔÖÉÏÉè¼Æ£¬¼¯Èº½ÚµãµÄ²¿Ê𣬻áÑ¡ÔñµÄÒìµØ¶à»ú·¿£¬ËùÒÔ ¡¸Partition tolerance¡¹ÊDz»¿ÉÄܱÜÃâµÄ¡£ÄÇô¿ÉÑ¡µÄÊÇ
AP Óë CP¡£
ÔÚHIDS¼¯ÈºµÄ³¡¾°À¸÷¸öAgent¶Ô¼¯Èº³ÖÐø¿ÉÓÃÐÔûÓзdz£Ç¿µÄÒªÇó£¬ÔÚ¶ÌÔÝʱ¼äÄÚ£¬ÊÇ¿ÉÒÔ³öÏÖÒì³££¬³öÏÖÎÞ·¨Í¨Ñ¶µÄÇé¿ö¡£µ«×îÖÕ״̬±ØÐëÒªÒ»Ö£¬²»ÄÜ´æÔÚ¼¯ÈºÏ·¢¹ØÍ£Ö¸Á¶ø³öÏÖ¸ö±ðAgent²»Ìý´Ó¼¯Èº¿ØÖƵÄÇé¿ö³öÏÖ¡£ËùÒÔ£¬ÎÒÃÇÐèÒªÒ»¸öÂú×ã
CP µÄ²úÆ·¡£
Âú×ãCPµÄ²úÆ·Ñ¡Ôñ
ÔÚ¿ªÔ´ÉçÇøÖУ¬±È½Ï³öÃûµÄ¼¸¿îÂú×ãCPµÄ²úÆ·£¬±ÈÈçetcd¡¢ZooKeeper¡¢ConsulµÈ¡£ÎÒÃÇÐèÒª¸ù¾Ý¼¸¿î²úÆ·µÄÌØµã£¬¸ù¾ÝÎÒÃÇÐèÇóÀ´Ñ¡Ôñ·ûºÏÎÒÃÇÐèÇóµÄ²úÆ·¡£
²åÒ»¾ä£¬ÍøÉϺܶàÈË˵ConsulÊÇAP²úÆ·£¬ÕâÊǸö´íÎóµÄÃèÊö¡£¼ÈÈ»ConsulÖ§³Ö·Ö²¼Ê½²¿Êð£¬ÄÇôһ¶¨»á³öÏÖ¡¸ÍøÂç·ÖÇø¡¹µÄÎÊÌ⣬
ÄÇôһ¶¨ÒªÖ§³Ö¡¸Partition tolerance¡¹¡£ÁíÍ⣬ÔÚconsulµÄ¹ÙÍøÉÏ×Ô¼ºÒ²Ìáµ½ÁËÕâµã
Consul
is opinionated in its usage while Serf is a
more flexible and general purpose tool. In CAP
terms, Consul uses a CP architecture, favoring
consistency over availability. Serf is an AP
system and sacrifices consistency for availability.
This means Consul cannot operate if the central
servers cannot form a quorum while Serf will
continue to function under almost all circumstances.
|
etcd¡¢ZooKeeper¡¢Consul¶Ô±È
½èÓÃetcd¹ÙÍøÉÏetcdÓëZooKeeperºÍConsulµÄ±È½Ïͼ¡£

ÔÚÎÒÃÇHIDS AgentµÄÐèÇóÖУ¬³ýÁË»ù±¾µÄ·þÎñ·¢ÏÖ ¡¢ÅäÖÃͬ²½ ¡¢ÅäÖÃ¶à°æ±¾¿ØÖÆ ¡¢±ä¸ü֪ͨµÈ»ù±¾ÐèÇóÍ⣬ÎÒÃÇ»¹ÓлùÓÚ²úÆ·°²È«ÐÔÉϵĿ¼ÂÇ£¬±ÈÈç´«ÊäͨµÀ¼ÓÃÜ¡¢Óû§È¨ÏÞ¿ØÖÆ¡¢½ÇÉ«¹ÜÀí¡¢»ùÓÚKeyµÄȨÏÞÉ趨µÈ£¬Õâµã
etcd±È½Ï·ûºÏÎÒÃÇÒªÇ󡣺ܶà´óÐ͹«Ë¾¶¼ÔÚʹÓ㬱ÈÈçKubernetes¡¢AWS¡¢OpenStack¡¢Azure¡¢Google
Cloud¡¢Huawei CloudµÈ£¬²¢ÇÒetcdµÄÉçÇøÖ§³Ö·Ç³£ºÃ¡£»ùÓÚÕ⼸µãÒòËØ£¬ÎÒÃÇÑ¡Ôñetcd×÷ΪHIDSµÄ·Ö²¼Ê½¼¯Èº¹ÜÀí¡£
Ñ¡Ôñetcd
¶ÔÓÚetcdÔÚÏîÄ¿ÖеÄÓ¦Óã¬ÎÒÃÇ·Ö±ðʹÓò»Í¬µÄAPI½Ó¿ÚʵÏÖ¶ÔÓ¦µÄÒµÎñÐèÇ󣬰´ÕÕÒµÎñ»®·ÖÈçÏ£º
1.Watch»úÖÆÀ´ÊµÏÖÅäÖñä¸üÏ·¢£¬ÈÎÎñÏ·¢µÄʵʱ»ñÈ¡»úÖÆ¡£
2.ÄÔÁÑÎÊÌâÔÚetcdÖв»´æÔÚ£¬etcd¼¯ÈºµÄÑ¡¾Ù£¬Ö»ÓÐͶƱ´ïµ½
N/2+1 ÒÔÉÏ£¬²Å»áÑ¡×öLeader£¬À´±£Ö¤Êý¾ÝÒ»ÖÂÐÔ¡£ÁíÍâÒ»¸öÍøÂç·ÖÇøµÄMember½Úµã½«ÎÞÖ÷¡£
3.ÓïÑÔÇ׺ÍÐÔ£¬Ò²ÊÇGolang¿ª·¢µÄ£¬Client SDK¿âÎȶ¨¿ÉÓá£
4.Key´æ´¢µÄÊý¾Ý½á¹¹Ö§³Ö·¶Î§ÐÔµÄKey²Ù×÷¡£
5.User¡¢RoleȨÏÞÉ趨²»Í¬¶ÁдȨÏÞ£¬À´¿ØÖÆKey²Ù×÷£¬±ÜÃâÆäËû¿Í»§¶ËÐÞ¸ÄÆäËûKeyµÄÐÅÏ¢¡£
6.TLSÀ´±£Ö¤Í¨µÀÐÅÏ¢´«µÝ°²È«¡£
7.Txn·Ö²¼Ê½ÊÂÎñAPIÅäºÏCompare APIÀ´È·¶¨Ö÷»úÉÏÏßµÄKeyΨһÐÔ¡£
8.Lease×âÔ¼»úÖÆ£¬¹ýÆÚKeyÊÍ·Å£¬¸üºÃµÄ¸ÐÖªÖ÷»úÏÂÏßÐÅÏ¢¡£
9.etcdµ×²ãKeyµÄ´æ´¢ÎªBTree½á¹¹£¬²éÕÒʱ¼ä¸´ÔÓ¶ÈΪO£¨©Sn£©£¬°ÙÍò¼¶ÉõÖÁǧÍò¼¶KeyµÄ²éÕÒºÄÊ±Çø±ð²»´ó¡£
etcd KeyµÄÉè¼Æ
ǰ׺°´½ÇÉ«É趨£º
1.ServerÅäÖÃÏ·¢Ê¹Óà /hids/server/config/{hostname}/master¡£
2.Agent×¢²áÉÏÏßʹÓà /hids/agent/master/{hostname}¡£
3.PluginÅäÖûñȡʹÓà /hids/agent/config/{hostname}/plugin/ID/conf_name¡£
Server Watch /hids/server/config/{hostname}/master£¬ÊµÏÖAgentÖ÷»úÉÏÏßµÄ˲¼ä¸ÐÖª¡£Agent
Watch /hids/server/config/{hostname}/À´»ñÈ¡ÅäÖñä¸ü£¬ÈÎÎñÏ·¢¡£Agent×¢²áµÄKey´øÓÐLease
Id£¬²¢ÆôÓÃkeepalive£¬ÏÂÏߺó˲¼ä¸ÐÖª¡£ £¨Òì³£ÏÂÏߣ¬»áÓÐ1/3µÄkeepaliveʱ¼äÑÓ³Ù£©
¹ØÓÚKeyµÄȨÏÞ£¬¸ù¾Ý²»Í¬Ç°×º£¬É趨²»Í¬RoleȨÏÞ¡£¸³Öµ¸ø²»Í¬µÄUser£¬À´ÊµÏÖ¶ÔKeyµÄȨÏÞ¿ØÖÆ¡£
etcd¼¯Èº¹ÜÀí
ÔÚetcd½ÚµãÈÝÔÖ¿¼ÂÇ£¬¿¼ÂÇDNS¹ÊÕÏʱ£¬½Úµã»áÑ¡Ôñ²¿ÊðÔÚ¶à¸ö³ÇÊУ¬¶à¸ö»ú·¿£¬ÒÔÎÒÃÇ·þÎñÆ÷»ú·¿Ñ¡ÔñÀ´¿´£¬Ôڴ󲿷ֻú·¿¶¼ÓÐÒ»¸ö½Úµã£¬×ۺϳÐÔØÐèÇó£¬ÎÒÃÇÑ¡ÔñÁËN̨·þÎñÆ÷²¿ÊðÔÚ¸ö±ðÖØÒª»ú·¿£¬À´Âú×ã¸ºÔØ¡¢ÈÝÔÖÐèÇó¡£µ«¶ÔÓÚetcdÕâÖÖ·Ö²¼Ê½Ò»ÖÂÐÔÇ¿µÄ×é¼þÀ´Ëµ£¬Ã¿¸öд²Ù×÷¶¼ÐèÒªN/2-1µÄ½ÚµãÈ·Èϱä¸ü£¬²Å»á½«Ð´ÇëÇóдÈëÊý¾Ý¿âÖУ¬ÔÙͬ²½µ½¸÷¸ö½Úµã£¬ÄÇôÒâζ׎ڵãÔ½¶à£¬ÐèҪȷÈϵÄÍøÂçÇëÇóÔ½¶à£¬ºÄʱԽ¶à£¬·´¶ø»áÓ°Ï켯Ⱥ½ÚµãÐÔÄÜ¡£Õâµã£¬ÎÒÃǺóÐø½«ÌáÉýµ¥¸ö·þÎñÆ÷ÐÔÄÜ£¬ÒÔ¼°ÎþÉü²¿·ÖÈÝÔÖÐÔÀ´ÌáÉý¼¯Èº´¦ÀíËÙ¶È¡£
¿Í»§¶ËÌîдµÄIPÁÐ±í£¬°üº¬ÓòÃû¡¢IP¡£IPÓÃÀ´¹æ±ÜDNS¹ÊÕÏ£¬ÓòÃûÓÃÀ´×öMember½Úµã¸üС£×îºÃ²»ÒªÊ¹ÓÃDiscover·½°¸£¬±ÜÃâ¶ÔÄÚÍøDNS·þÎñÆ÷²úÉú½Ï´óѹÁ¦¡£
ͬʱ£¬ÔÚÅäÖÃetcd½ÚµãµÄµØÖ·Ê±£¬Ò²Òª¿¼Âǵ½ÄÚÍøDNS¹ÊÕϵij¡¾°£¬µØÖ·Ìîд»á»ìºÏIP¡¢ÓòÃûÁ½ÖÖÐÎʽ¡£
1.IPµÄµØÖ·£¬±ãÓÚ¹æ±ÜÄÚÍøDNS¹ÊÕÏ¡£
2.ÓòÃûÐÎʽ£¬±ãÓÚ×ö¸ö±ð½Úµã¸üÌæ»òÀ©ÈÝ¡£
ÎÒÃÇÔÚÉè¼Æ²úÆ·¼Ü¹¹Ê±£¬ÎªÁ˰²È«ÐÔ£¬¿ªÆôÁËTLSÖ¤ÊéÈÏÖ¤£¬µ±½Úµã±ä¸üʱ£¬Ö¤ÊéµÄÉú³ÉҲͬÑùÒª¿¼Âǵ½ÉÏÃæÁ½ÖÖ·½°¸µÄÓ°Ï죬֤ÊéÀïÐèÒª°üº¬¹Ì¶¨IP£¬ÒÔ¼°DNSÓòÃû·¶Î§µÄÁ½ÖÖ¸ñʽ¡£
etcd Cluster½ÚµãÀ©ÈÝ
½ÚµãÀ©ÈÝ£¬¹Ù·½ÊÖ²áÉÏÒ²ÓÐÍêÕûµÄ·½°¸£¬etcdµÄClientÀïʵÏÖÁ˽¡¿µ¼ì²âÓë¹ÊÕÏÇ¨ÒÆ£¬ÄÜ×Ô¶¯µÄÇ¨ÒÆµ½½ÚµãIPÁбíÖÐµÄÆäËû¿ÉÓÃIP¡£Ò²Äܶ¨Ê±¸üÐÂetcd
Node List£¬¶ÔÓÚetcd ClusterµÄ¼¯Èº½Úµã±ä¸üÀ´Ëµ£¬²»´æÔÚÎÊÌâ¡£ÐèÒªÎÒÃÇ×¢ÒâµÄÊÇ£¬TLSÖ¤ÊéµÄ¼æÈÝ¡£
·Ö²¼Ê½HIDS¼¯Èº¼Ü¹¹Í¼

¼¯ÈººËÐÄ×é¼þ¸ß¿ÉÓã¬ËùÓÐAgent¡¢Server¶¼ÒÀÀµ¼¯Èº£¬¶¼¿ÉÒÔÎÞ·ìÀ©Õ¹£¬ÇÒ²»Ó°ÏìÕû¸ö¼¯ÈºµÄÎȶ¨ÐÔ¡£¼´Ê¹ServerÈ«²¿å´»ú£¬Ò²²»Ó°ÏìËùÓÐAgentµÄ¼ÌÐø¹¤×÷¡£
ÔÚÒÔºóServer°æ±¾Éý¼¶Ê±£¬Agent²»»áÖжϣ¬Ò²²»»á´øÀ´Ñ©±ÀʽµÄÓ°Ïì¡£etcd¼¯Èº¿ÉÒÔ×öµ½µ¥½ÚµãÉý¼¶£¬Ò»Ö±µ½Õû¸ö¼¯ÈºÉý¼¶£¬¸÷¸ö×é¼þÈ«¶¼½âñî¡£
±à³ÌÓïÑÔÑ¡Ôñ
¿¼Âǵ½¹«Ë¾·þÎñÆ÷Á¿´ó£¬ÒµÎñ¸´ÔÓ£¬ÐèÇó»·¾³¶à±ä£¬²Ù×÷ϵͳ¿ÉÄܰüÀ¨¸÷ÖÖLinuxÒÔ¼°WindowsµÈ¡£ÎªÁ˱£Ö¤ÏµÍ³µÄ¼æÈÝÐÔ£¬ÎÒÃÇÑ¡ÔñÁËGolang×÷Ϊ¿ª·¢ÓïÑÔ£¬Ëü¾ß±¸ÒÔÏÂÌØµã£º
1.¿ÉÒÔ¾²Ì¬±àÒ룬ֱ½Óͨ¹ýsyscallÀ´ÔËÐУ¬²»ÒÀÀµlibc£¬¼æÈÝÐԸߣ¬¿ÉÒÔÔÚËùÓÐLinuxÉÏÖ´ÐУ¬²¿Êð±ã½Ý¡£
2.¾²Ì¬±àÒëÓïÑÔ£¬Äܽ«¼òµ¥µÄ´íÎóÔÚ±àÒëǰ¾Í·¢ÏÖ¡£
3.¾ß±¸Á¼ºÃµÄGC»úÖÆ£¬Õ¼ÓÃϵͳ×ÊÔ´ÉÙ£¬¿ª·¢³É±¾µÍ¡£
4.ÈÝÆ÷»¯µÄºÜ¶à²úÆ·¶¼ÊÇGolang±àд£¬±ÈÈçKubernetes¡¢DockerµÈ¡£
5.etcdÏîĿҲÊÇGolang±àд£¬Àà¿â¡¢²âÊÔÓÃÀý¿ÉÒÔÖ±½ÓÓã¬SDKÖ§³Ö¿ìËÙ¡£
6.Á¼ºÃµÄCSP²¢·¢Ä£ÐÍÖ§³Ö£¬¸ßЧµÄг̵÷¶È»úÖÆ¡£
²úÆ·¼Ü¹¹´ó·½Ïò
HIDS²úÆ·Ñз¢Íê³Éºó£¬²¿ÊðµÄ·þÎñ¶¼ÔËÐÐן÷ÖÖÒµÎñµÄ·þÎñÆ÷£¬ÒµÎñµÄÖØÒªÐÔÅÅÔÚµÚÒ»£¬ÎÒÃDzúÆ·µÄ¹¦ÄÜÅÅÔÚºóÃæ¡£Îª´Ë£¬È·¶¨Á˼¸¸ö²úÆ·µÄ´ó·½Ïò£º
¸ß¿ÉÓã¬Êý¾ÝÒ»Ö£¬¿ÉºáÏòÀ©Õ¹¡£
ÈÝÔÖÐԺã¬ÄÜÓ¦¶Ô»ú·¿¼¶µÄÍøÂç¹ÊÕÏ¡£
¼æÈÝÐԺã¬Ö»Î¬»¤Ò»¸ö°æ±¾µÄAgent¡£
ÒÀÀµµÍ£¬²»ÒÀÀµÈκζ¯Ì¬Á´½Ó¿â¡£
ÇÖÈëÐԵͣ¬²»×öHook£¬²»×öϵͳÀà¿â¸ü¸Ä¡£
È۶Ͻµ¼¶¿É¿¿£¬Äþ¿É×Ô¼º¹Òµô£¬Ò²²»Ó°ÏìÒµÎñ ¡£
²úƷʵÏÖ
ƪ·ùÏÞÖÆ£¬½öÌÖÂÛ¿ò¼ÜÉè¼Æ¡¢ÈÛ¶ÏÏÞÁ÷¡¢¼à¿Ø¸æ¾¯¡¢×ÔÎÒ»Ö¸´ÒÔ¼°²úƷʵÏÖÉϵÄÖ÷½ø³ÌÓë½ø³Ì¼à¿Ø¡£
¿ò¼ÜÉè¼Æ 
ÈçÉÏͼ£¬ÔÚ¿ò¼ÜµÄÉè¼ÆÉÏ£¬·â×°³£ÓÃÀà¿â£¬³éÏ󻯶¨ÒåInterface£¬°þÀëetcd Client£¬È«¾Ö»¯Logger£¬³éÏó»¯AppµÄÆô¶¯¡¢Í˳ö·½·¨¡£Ê¹µÃ¸÷Ä£¿é£¨ÒÔϼò³ÆApp£©Ö»ÐèҪʵÏÖ×Ô¼ºµÄÒµÎñ¼´¿É£¬¿ÉÒÔ·½±ã¿ì½ÝµÄ½øÐÐÂß¼±àд£¬ÎÞÐè¹ØÐĵײãʵÏÖ¡¢ÅäÖÃÀ´Ô´¡¢ÖØÊÔ´ÎÊý¡¢ÈÛ¶Ï·½°¸µÈµÈ¡£
ɳÏä¸ôÀë
¿¼Âǵ½×Ó½ø³Ì²»ÄÜÎÞÏÞµÄÔö³¤ÏÂÈ¥£¬ÄÇô±ØÈ»ÓÐÒ»¸ö½ø³Ì°üº¬¶à¸öÄ£¿éµÄ¹¦ÄÜ£¬¸÷AppÖ®¼ä¼ÈÄÜʹÓù«Óõײã×é¼þ£¨Logger¡¢etcd
ClientµÈ£©£¬ÓÖÄÜÈñ˴ËÖ®¼ä»¥²»Ó°Ï죬ÕâÀï½øÐÐÁËɳÏ仯´¦Àí£¬¸÷¸öÊôÐÔ¶ÔÏó½öÔÚ¸÷AppµÄsandboxÀïÉúЧ¡£Í¬ÑùÄÜʵÏÖÁËApp½ø³ÌµÄÐÔÄÜÈÛ¶Ï£¬Í£Ö¹ËùÓеÄÒµÎñÂß¼¹¦ÄÜ£¬µ«ÓÖÄܾßÓлù±¾µÄ×ÔÎÒ»Ö¸´¹¦ÄÜ¡£
IConfig
¶Ô¸÷AppµÄÅäÖóéÏ󻯴¦Àí£¬ÊµÏÖIConfigµÄ¹²Óз½·¨½Ó¿Ú£¬ÓÃÓÚ¶ÔÅäÖõĺ¯Êýµ÷Ó㬱ÈÈçCheckµÄ¼ì²â·½·¨£¬¼ì²âÅäÖúϷ¨ÐÔ£¬¼ì²âÅäÖõÄ×î´óÖµ¡¢×îСֵ·¶Î§£¬¹æ±ÜʹÓÃÈËÔ±ÅäÖò»ÔÚºÏÀí·¶Î§ÄÚµÄÇé¿ö£¬´Ó¶ø±ÜÃâ´øÀ´µÄ·çÏÕ¡£
¿ò¼Üµ×²ãÓÃReflectÀ´´¦ÀíJSONÅäÖ㬽âÎö¶ÁÈ¡ÌîдµÄÅäÖÃÏ¸úConfig¶ÔÏó¶Ô±È£¬Ìî³äµ½¶ÔÓ¦StructµÄÊôÐÔÉÏ£¬ÔÊÐíJSONÅäÖÃÀïÖ»Ìîд±ä»¯µÄÅäÖã¬Ã»ÌîдµÄÅäÖÃÏÔòʹÓÃConfig¶ÔÓ¦StructµÄĬÈÏÅäÖᣱãÓÚÁé»î´¦ÀíÅäÖÃÐÅÏ¢¡£
type
IConfig interface {
Check() error //¼ì²âÅäÖúϷ¨ÐÔ
}
func ConfigLoad(confByte []byte, config IConfig)
(IConfig, error) {
...
//·´ÉäÉú³ÉÁÙʱµÄIConfig
var confTmp IConfig
confTmp = reflect.New(reflect.ValueOf(config).Elem().Type()).
Interface().(IConfig)
...
//·´Éä confTmp µÄÊôÐÔ
confTmpReflect := reflect.TypeOf(confTmp).Elem()
confTmpReflectV := reflect.ValueOf(confTmp).Elem()
//·´Éäconfig IConfig
configReflect := reflect.TypeOf(config).Elem()
configReflectV := reflect.ValueOf(config).Elem()
...
for i = 0; i < num; i++ {
//±éÀú´¦Àíÿ¸öField
envStructTmp := configReflect.Field(i)
//¸ù¾ÝÅäÖÃÖеÄÏÀ´¸²¸ÇĬÈÏÖµ
if envStructTmp.Type == confStructTmp.Type {
configReflectV.FieldByName(envStructTmp.Name).
Set(confTmpReflectV.Field(i))
|
Timer¡¢Clockµ÷¶È
ÔÚÒµÎñÊý¾Ý²úÉúʱ£¬ºÜ¶àµØ·½ÐèÒª¼Ç¼ʱ¼ä£¬Ê±¼äµÄ»ñȡҲ»á²úÉúºÜ¶àϵͳµ÷Óá£ÓÈÆäÊÇÔÚÿÃëÖÓ²úÉú³ÉǧÉÏÍò¸öʼþ£¬ÕâЩʼþ¶¼ÐèÒªµ÷Óûñȡʱ¼ä½Ó¿Ú£¬½øÐÐclock_gettimeµÈϵͳµ÷Ó㬻á´ó´óÔö¼ÓϵͳCPU¸ºÔØ¡£
¶øºÜ¶àʼþ²úÉúʱ¼äµÄ׼ȷÐÔÒªÇ󲻸ߣ¬¾«È·µ½Ã룬»òÕß¼¸°Ù¸öºÁÃë¼´¿É£¬ÄÇô¿ò¼ÜÀïʵÏÖÁËÒ»¸ö¿ÅÁ£¶È·ûºÏÐèÇóµÄ£¨±ÈÈç100ms¡¢200ms¡¢»òÕß1sµÈ£©¼ä¸ôʱ¼ä¸üеÄʱÖÓ£¬¼´Âú×ãʼþ¶Ôʱ¼äµÄÐèÇó£¬ÓÖ¼õÉÙÁËϵͳµ÷Óá£
ͬÑù£¬ÔÚÓÐЩTicker³¡¾°ÖУ¬TickerµÄ¼ä¸ô¿ÅÁ£ÒªÇ󲻸ßʱ£¬Ò²¿ÉÒԺϲ¢³ÉÒ»¸öTicker£¬¼õÉÙ¶ÔCPUʱÖӵĵ÷Óá£
Catcher
ÔÚ¶àг̳¡¾°Ï£¬»áÓõ½ºÜ¶àгÌÀ´´¦Àí³ÌÐò£¬¶ÔÓÚ¸ö±ðг̵Äpanic´íÎó£¬ÉϲãÏß³ÌÒªÓÐÒ»¸öÁ¼ºÃµÄ²¶»ñ»úÖÆ£¬Äܽ«Ð³Ì´íÎóÅ׳öÈ¥£¬²¢Äָܻ´ÔËÐУ¬²»ÒªÈýø³Ì±ÀÀ£Í˳ö£¬Ìá¸ß³ÌÐòµÄÎȶ¨ÐÔ¡£
³éÏó½Ó¿Ú
¿ò¼Üµ×²ã³éÏ󻯷â×°SandboxµÄInit¡¢Run¡¢Shutdown½Ó¿Ú£¬¹æ·¶¸÷AppµÄ¶ÔÍâ½Ó¿Ú£¬ÈÃAppµÄ³õʼ»¯¡¢ÔËÐС¢Í£Ö¹µÈ²Ù×÷¶¼±ê×¼»¯¡£AppµÄÄ£¿éÒµÎñÂß¼£¬²»ÐèÒª¹Ø×¢PIDÎļþ¹ÜÀí£¬²»¹Ø×¢Ó뼯ȺͨѶ£¬²»¹ØÐÄÓ븸½ø³ÌͨѶµÈͨÓòÙ×÷£¬Ö»ÐèҪʵÏÖ×Ô¼ºµÄÒµÎñÂß¼¼´¿É¡£AppÓë¿ò¼ÜµÄͳһ¿ØÖÆ£¬²ÉÓÃContext°üÒÔ¼°Sync.CondµÈÌõ¼þËø×÷Ϊͬ²½¿ØÖÆÌõ¼þ£¬À´Í¬²½AppÓë¿ò¼ÜµÄÉúÃüÖÜÆÚ£¬Í¬²½¶àгÌÖ®¼äͬ²½£¬²¢ÊµÏÖAppµÄ°²È«Í˳ö£¬±£Ö¤Êý¾Ý²»¶ªÊ§¡£
ÏÞÁ÷
ÍøÂçIO
1.ÏÞÖÆÊý¾ÝÉϱ¨ËÙ¶È¡£
2.¶ÓÁд洢Êý¾ÝÈÎÎñÁÐ±í¡£
3.´óÓÚ¶ÓÁ㤶ÈÊý¾Ý¶ªÆú¡£
4.¶ªÆúÊý¾Ý×ÜÊý¼ÆÊý¡£
5.¼ÆÊýÐÅÏ¢×÷ΪÐÄÌø×´Ì¬Êý¾ÝÉϱ¨µ½ÈÕÖ¾ÖÐÐÄ£¬ÓÃÓÚÊý¾Ý¶ÔÕË¡£
´ÅÅÌIO
³ÌÐòÔËÐÐÈÕÖ¾£¬¶ÔÈÕÖ¾¼¶±ð»®·Ö£¬²Î¿¼ /usr/include/sys/syslog.h£º
1.LOG_EMERG
2.LOG_ALERT
3.LOG_CRIT
4.LOG_ERR
5.LOG_WARNING
6.LOG_NOTICE
7.LOG_INFO
8.LOG_DEBUG
ÔÚ´úÂë±àдʱ£¬¸ù¾ÝÐèÇóÑ¡Óü¶±ð¡£¼¶±ðÔ½µÍÈÕÖ¾Á¿Ô½´ó£¬ÖØÒª³Ì¶ÈÔ½µÍ£¬Ô½²»ÐèÒª·¢ËÍÖÁÈÕÖ¾ÖÐÐÄ£¬Ð´Èë±¾µØ´ÅÅÌ¡£ÄÇôÔÚÒì³£Çé¿öÅŲéʱ£¬·½±ã²Î¿¼¡£
ÈÕÖ¾Îļþ´óС¿ØÖÆ£¬·Ö2¸öÎļþ£¬Ã¿¸öÎļþ²»³¬¹ý¹Ì¶¨´óС£¬±ÈÈç20M¡¢50MµÈ¡£²¢ÇÒ£¬¶ÔÁ½¸öÎļþ½øÐÐÀ´»ØÐ´£¬±ÜÃâÈÕ־дÂú´ÅÅ̵ÄÇé¿ö¡£
IRetry
ΪÁ˼ÓÇ¿AgentµÄ³°ôÐÔ£¬²»ÄÜÒòΪijЩRPC¶¯×÷ʧ°Üºóµ¼ÖÂÕûÌ幦Äܲ»¿ÉÓã¬Ò»°ã»áÓÐÖØÊÔ¹¦ÄÜ¡£Agent¸úetcd
ClusterÒ²ÊÇTCP³¤Á¬½Ó£¨HTTP2£©£¬µ±½ÚµãÖØÆô¸ü»»»òÍøÂ翨¶ÙµÈÒ쳣ʱ£¬Agent»áÖØÁ¬£¬ÄÇÃ´ÖØÁ¬µÄƵÂÊ¿ØÖÆ£¬²»ÄÜÊÇËÀÑ»·°ãµÄÖØÊÔ¡£¼ÙÉè·þÎñÆ÷ÄÚÍø½»»»»úÒòÄÚÍøÁ÷Á¿½Ï´ó²úÉú¶¶¶¯£¬´¥·¢ÁËAgentÖØÁ¬»úÖÆ£¬²»¶ÏµÄÖØÁ¬ÓÖ¼ÓÖØÁ˽»»»»úµÄ¸ºµ££¬Ôì³ÉÑ©±ÀЧӦ£¬ÕâÖÖÉè¼Æ±ØÐëÒª±ÜÃâ¡£
ÔÚÿ´ÎÖØÊÔºó£¬ÐèÒª×öÒ»¶¨µÄ»ØÍË»úÖÆ£¬³£¼ûµÄÖ¸Êý¼¶»ØÍË£¬±ÈÈçÈçÏÂÉè¼Æ£¬ÔÚ¹æ±ÜÑ©±À³¡¾°Ï£¬ÓÖÄܱ£ÕÏAgentµÄ³°ôÐÔ£¬É趨×î´óÖØÊÔ¼ä¸ô£¬Ò²±ÜÃâÁËAgentʧ¿ØµÄÎÊÌâ¡£
//ÍøÂç¿âÖØÊÔInterface
type INetRetry interface {
//¿ªÊ¼Á¬½Óº¯Êý
Connect() error
String() string
//»ñÈ¡×î´óÖØÊÔ´ÎÊý
GetMaxRetry() uint
...
}
// µ×²ãʵÏÖ
func (this *Context) Retry(netRetry INetRetry)
error {
...
maxRetries = netRetry.GetMaxRetry() //×î´óÖØÊÔ´ÎÊý
hashMod = netRetry.GetHashMod()
for {
if c.shutting {
return errors.New("c.shutting is true...")
}
if maxRetries > 0 && retries >=
maxRetries {
c.logger.Debug("Abandoning %s after %d
retries.", netRetry.String(), retries)
return errors.New("³¬¹ý×î´óÖØÊÔ´ÎÊý")
}
...
if e := netRetry.Connect(); e != nil {
delay = 1 << retries
if delay == 0 {
delay = 1
}
delay = delay * hashInterval
...
c.logger.Emerg("Trying %s after %d seconds
, retries:%d,error:%v", netRetry.String(),
delay, retries, e)
time.Sleep(time.Second * time.Duration(delay))
}
...
}
|
ʼþ²ð·Ö
°ÙÍǫ̀IDC¹æÄ£µÄAgent²¿Êð£¬ÔÚÈÎÎñÖ´ÐС¢¼¯ÈºÍ¨Ñ¶»ò¶ÔËÞÖ÷»ú²úÉú×ÊÔ´Ó°Ïìʱ£¬Îñ±ØÒª´í·å½øÐУ¬¸ù¾Ýÿ̨Ö÷»úµÄÎ¨Ò»ÌØÕ÷ȡ죬²ð·ÖÖ´ÐУ¬±ÜÃâÔì³ÉÑ©±ÀЧӦ¡£
¼à¿Ø¸æ¾¯
¹Åʱºò£¬Ðоü´òÕÌʱ£¬Ìᳫ¡¸±øÂíδ¶¯£¬Á¸²ÝÏÈÐС¹£¬ÎÞÒÉÊÇÀä±øÆ÷ʱ´ú¾ö¶¨Ê¤¸º×ßÏòµÄÖØÒªÒòËØ¡£×ö²úÆ·Ò²ÊÇ£¬ÓÈÆäÊÇ´óÐͲúÆ·£¬Òª¶Ô×Ô¼ºÔËÐÐ×´¿öÓÐÏêϸµÄÕÆ¿Ø£¬×öºÃ¼à¿Ø¸æ¾¯£¬²ÅÄÜÈ·±£²úÆ·µÄ³É¹¦¡£
¶ÔÓÚetcd¼¯ÈºµÄ¼à¿Ø£¬×é¼þ±¾ÉíÌṩÁËMetricsÊý¾ÝÊä³ö½Ó¿Ú£¬¹Ù·½ÍƼöÁËPrometheusÀ´²É¼¯Êý¾Ý£¬Ê¹ÓÃGrafanaÀ´×ö¾ÛºÏ¼ÆË㡢ͼ±ê»æÖÆ£¬ÎÒÃÇ×öÁËAlertµÄ½Ó¿Ú¿ª·¢£¬¶Ô½ÓÁ˹«Ë¾µÄ¸æ¾¯ÏµÍ³£¬ÊµÏÖIM¡¢¶ÌÐÅ¡¢µç»°¸æ¾¯¡£
AgentÊýÁ¿¸ÐÖª£¬ÒÀÀµWatchÊý×Ö£¬ÊµÊ±×¼È·¸ÐÖª¡£
ÈçÏÂͼ£¬À´×Ô²úÆ·¸Õ¿ªÊ¼»Ò¶ÈʱµÄijһʱ¿Ì½ØÍ¼£¬Active Streams£¨¼´etcd WatchµÄKeyÊýÁ¿£©¼´Îª¶ÔÓ¦AgentÊýÁ¿£¬Ã¿´Î»Ò¶ÈµÄ²úÆ·ÊýÁ¿¡£ÒòΪ¸Ã²Ù×÷£¬ÊÇAgentÖ±½ÓÓ뼯ȺͨѶ£¬²¢ÇÒÿ¸öAgentÖ»WatchÒ»¸öKey¡£ÇÒ¼¯ÈºÊý¾Ý¾ß±¸Î¨Ò»ÐÔ¡¢Ò»ÖÂÐÔ£¬Ô¶±ÈÐÄÌøÈÕÖ¾µÄ´¦ÀíҪ׼ȷµÄ¶à¡£

etcd¼¯ÈºMembersÖ®¼ä½¡¿µ×´¿ö¼à¿Ø

ÓÃÓÚ¼à¿Ø¹ÜÀíetcd¼¯ÈºµÄ×´¿ö£¬°üÀ¨Member½ÚµãÖ®¼äÊý¾Ýͬ²½£¬LeaderÑ¡¾Ù´ÎÊý£¬Í¶Æ±·¢Æð´ÎÊý£¬¸÷½ÚµãµÄÄÚ´æÉêÇë×´¿ö£¬GCÇé¿öµÈ£¬¶Ô¼¯ÈºµÄ½¡¿µ×´¿ö×öÈ«ÃæÕÆ¿Ø¡£
³ÌÐòÔËÐÐ״̬¼à¿Ø¸æ¾¯


È«Á¿¼à¿ØAagentµÄ×ÊÔ´Õ¼ÓÃÇé¿ö£¬Í³¼ÆÃ¿ÌìʹÓÃ×î´óCPU\ÄÚ´æµÄÖ÷»úAgent£¬È·¶¨ÎÊÌâµÄÓ°Ï췶Χ£¬¼°Ê±×ö²ßÂÔµ÷Õû£¬±ÜÃâÓ°Ïìµ½ÒµÎñ·þÎñµÄÔËÐС£²¢ÔÚºóÐø°æ±¾ÉÏÖð²½×öµ÷ÕûÓÅ»¯¡£
°ÙÍǫ̀·þÎñÆ÷£¬ÈÕÖ¾¸æ¾¯Á¿·Ç³£´ó£¬Õâ¸ö¼¶±ðµÄ¸æ¾¯ÐÅÏ¢µÄɸѡ¡¢¾ÛºÏÊDZز»¿ÉÉٵġ£¼õÉÙÎÞÓø澯£¬ÈÃÑз¢ÔËάÈËԱƣÓÚ±¼Ãü£¬Ò²±ÜÃâÎÞÓø澯µ¼ÖÂÑз¢ÈËÔ±·ÅËÉÁ˾¯Ì裬ǰÆÚºöÂÔ¸öÀý¸æ¾¯£¬ÏȽâ¾öÖ÷Ҫì¶Ü¡£
1.¸æ¾¯ÐÅÏ¢·Ö¼¶£¬¸æ¾¯ÐÅϢϸ·ÖID¡£
2.¸ù¾Ý¸æ¾¯¼¶±ð¹ýÂË£¬¸ù¾Ý¸æ¾¯ID¾ÛºÏ¸æ¾¯£¬À´·¢ÏÖͬÀàÐÍ´íÎó¡£
3.¸ù¾Ý¸æ¾¯ÐÅÏ¢µÄËùÔÚ»ú·¿¡¢ÏîÄ¿×é¡¢²úÆ·ÏßµÈά¶ÈÀ´¾ÛºÏ¸æ¾¯£¬À´·¢ÏÖͬÀàÐÍ´íÎó¡£
Êý¾Ý²É¼¯¸æ¾¯
µ¥»úÊý¾ÝÊý¾Ý´óС¡¢×ÜÁ¿µÄÀúÊ·Êý¾Ý¶Ô±È¸æ¾¯¡£
°´»ú·¿¡¢ÏîÄ¿×é¡¢²úÆ·ÏßµÈά¶ÈµÄ´óС¡¢×ÜÁ¿µÈά¶ÈµÄÀúÊ·Êý¾Ý¶Ô±È¸æ¾¯¡£
Êý¾Ý²É¼¯´óС¡¢×ÜÁ¿µÄ¶ÔÕ˹¦ÄÜ£¬ÅжϾ¹ýһϵÁд¦ÀíÁ÷³ÌµÄÈÕÖ¾ÊÇ·ñ¶ªÊ§µÄ¼à¿Ø¸æ¾¯¡£
ÈÛ¶Ï
1.Õë¶Ôµ¥»úAgentʹÓÃ×ÊÔ´´óСµÄãÐÖµÈÛ¶Ï£¬CPUʹÓÃÂÊ£¬Á¬ÐøN´Î´¥·¢´óÓÚµÈÓÚ5%£¬Ôò½øÐб£»¤ÐÔÈÛ¶Ï£¬Í˳öËùÓÐÒµÎñÂß¼£¬ÒÔ±£»¤Ö÷»úµÄÒµÎñ³ÌÐòÓÅÏÈ¡£
2.Master½ø³Ì½øÈë¿ÕÏÐ״̬£¬µÈ´ýµÚ¶þ´Îʱ¼äTickerµ½À´£¬¾ö¶¨ÊÇ·ñ»Ö¸´ÔËÐС£
3.¸÷¸öApp»ùÓÚÒµÎñ²ãÃæµÄ¼à¿ØÈ۶ϲßÂÔ¡£
»Ò¶È¹ÜÀí
ÔÚÇ°ÃæµÄÅäÖùÜÀíÖеÄetcd KeyÉè¼ÆÀÒѾϸ·Öµ½Ã¿¸öÖ÷»ú£¨¼´Ã¿¸öAgent£©Ò»¸öKey¡£ÄÇô£¬·þÎñ¶ËµÄ¹ÜÀí£¬Ö»ÒªÇø·Ö¸ÃÖ÷»úËùÊô»ú·¿¡¢»·¾³¡¢Èº×é¡¢²úÆ·Ïß¼´¿É£¬ÄÇô£¬ÎÒÃǵĹÜÀíAgentµÄ¿ÅÁ£¶È¿ÉÒÔ¾«È·µ½Ã¿¸öÖ÷»ú£¬Ò²¾ÍÊÇÖ§³ÖÈÎÒâγ¶ÈµÄ»Ò¶È·¢²¼¹ÜÀíÓëÃüÁîÏ·¢¡£
Êý¾ÝÉϱ¨Í¨µÀ
×é¼þÃûΪ log_agent £¬Êǹ«Ë¾ÄÚ²¿Í³Ò»ÈÕÖ¾Éϱ¨×é¼þ£¬»á²¿ÊðÔÚÿһ̨VM¡¢DockerÉÏ¡£Ö÷»úÉÏËùÓÐÒµÎñ¾ù¿É½«ÈÕÖ¾·¢ËÍÖÁ¸Ã×é¼þ¡£
log_agent»á½«ÈÕÖ¾Éϱ¨µ½Kafka¼¯ÈºÖУ¬¾¹ý´¦Àíºó£¬ÂäÈëHive¼¯ÈºÖС££¨Ï¸½Ú²»ÔÚ±¾ÆªÌÖÂÛ·¶Î§£©
Ö÷½ø³Ì
Ö÷½ø³ÌʵÏÖ¸úetcd¼¯ÈºÍ¨ÐÅ£¬¹ÜÀíÕû¸öAgentµÄÅäÖÃÏ·¢ÓëÃüÁîÏ·¢£»¹ÜÀí¸÷¸ö×ÓÄ£¿éµÄÆô¶¯ÓëÍ£Ö¹£»¹ÜÀí¸÷¸ö×ÓÄ£¿éµÄCPU¡¢ÄÚ´æÕ¼ÓÃÇé¿ö£¬¶Ô×ÊÔ´³¬±ê½øÐнøÐÐÈÛ¶Ï´¦Àí£¬Èóö×ÊÔ´£¬±£Ö¤ÒµÎñ½ø³ÌµÄÔËÐС£
²å¼þ»¯¹ÜÀíÆäËûÄ£¿é£¬¶à½ø³Ìģʽ£¬±ãÓÚÌá¸ß²úÆ·Áé»îÐÔ£¬¿É¸ü¼ò±ãµÄ¸üÐÂÆô¶¯×ÓÄ£¿é£¬²»»áÒòΪ¸ö±ðÄ£¿é²å¼þµÄ¹¦ÄÜ¡¢BUGµ¼ÖÂÕû¸öAgent±ÀÀ£¡£
½ø³Ì¼à¿Ø
·½°¸Ñ¡Ôñ
ÎÒÃÇÔÚÑз¢Õâ²úƷʱ£¬×öÁËºÜ¶à¹ØÓÚlinux½ø³Ì´´½¨¼à¿ØµÄµ÷ÑУ¬²»ÏÞÓÚ°²È«²úÆ·£¬´óÔ¼ÓÐÏÂÃæÈýÖÖ¼¼Êõ·½°¸£º

¶ÔÓÚ¹«Ë¾µÄËùÓзþÎñÆ÷À´Ëµ£¬¼¸Ê®Íǫ̀¶¼ÊÇÒѾÔÚÔËÐеķþÎñÆ÷£¬ÐÂÉϵÄÈκβúÆ·£¬¶¼¾¡Á¿±ÜÃâ¶Ô·þÎñÆ÷ÓÐÓ°Ï죬¸üºÎ¿öÊÇËùÓзþÎñÆ÷¶¼Òª²¿ÊðµÄAgent¡£
Òâζ×ÅÎÒÃÇÔÚÑ¡ÔñϵͳÇÖÈëÐÔÀ´Ëµ£¬ÓÅÏÈÑ¡Ôñ×îСÇÖÈëÐԵķ½°¸¡£
¶ÔÓÚNetlinkµÄ·½°¸ÔÀí£¬¿ÉÒԲο¼ÕâÕÅͼ

ϵͳÇÖÈëÐԱȽÏ
cn_proc¸úAutidÔÚ¡¸ÏµÍ³ÇÖÈëÐÔ¡¹ºÍ¡¸Êý¾Ý׼ȷÐÔ¡¹À´Ëµ£¬cn_proc·½°¸¸üºÃ£¬¶øÇÒʹÓÃCPU¡¢ÄÚ´æµÈ×ÊÔ´Çé¿ö£¬¸ü¿É¿Ø¡£
HookµÄ·½°¸£¬¶ÔϵͳÇÖÈëÐÔÌ«¸ßÁË£¬ÓÈÆäÊÇÕâÖÖ×îµ×²ã×öHOOK syscallµÄ×ö·¨£¬ÍòÒ»²âÊÔ²»³ä·Ö£¬ÔÚÌØ¶¨»·¾³Ï£¬ÓÐÒ»¶¨µÄ¸ÅÂÊ»á³öÏÖBug£¬¶øÔÚ°ÙÍòIDCµÄ¹æÄ£Ï£¬Õ⽫³ÉΪ´óÃæ»ýʼþ£¬¿ÉÄÜ»áÔì³ÉÖØ´óʹʡ£
¼æÈÝÐÔÉϱȽÏ
cn_proc²»¼æÈÝDocker£¬Õâ¸ö¿ÉÒÔÔÚËÞÖ÷»úÉϲ¿ÊðÀ´½â¾ö¡£
HookµÄ·½°¸£¬ÐèÒªÕë¶ÔÿÖÖLinuxµÄ·¢Ðаæ×ö¶¨ÖÆ£¬Î¬»¤³É±¾½Ï¸ß£¬ÇÒ²»·ûºÏ³¤Ô¶Ä¿±ê£¨ÊÕ¹ºÍⲿ¹«Ë¾Ê±Óöµ½¸÷ʽ¸÷Ñù²Ù×÷ϵͳÎÊÌ⣩
Êý¾Ý׼ȷÐԱȽÏ
ÔÚ´óÁ¿PID´´½¨µÄ³¡¾°£¬±ÈÈçDockerµÄËÞÖ÷»úÉÏ£¬Äں˷µ»ØPIDʱ£¬ÒòΪPID·µ»Ø·Ç³£¶à·Ç³£¿ì£¬ºÜ¶à½ø³ÌÆô¶¯ºó£¬Á¢¿ÌÏûʧÁË£¬ÁíÍâÒ»¸öÏ̶߳¼»¹Ã»È¥¶ÁÈ¡/proc/£¬½ø³Ì¶¼¶ªÊ§ÁË£¬³¡¾°³£³öÏÖÔÚBashÖ´ÐÐijЩÃüÁî¡£
×îÖÕ£¬ÎÒÃÇÑ¡ÔñLinux Kernel Netlink½Ó¿ÚµÄcn_procÖ¸Áî×÷ΪÎÒÃǽø³Ì¼à¿Ø·½°¸£¬½èÖú¶ÔBashÃüÁîµÄÊÕ¼¯£¬×÷Ϊ¸Ã·½°¸µÄ²¹³ä¡£µ±È»£¬ÈÔÈ»´æÔÚ¶ªÊý¾ÝµÄÇé¿ö£¬µ«ÎÒÃÇΪÁËϵͳÎȶ¨ÐÔ£¬²úÆ·ÇÖÈëÐԵ͵ÈÒµÎñÐèÇó£¬ÎþÉüÁËһЩ°²È«ÐÔÉϵı£ÕÏ¡£
¶ÔÓÚDockerµÄ³¡¾°£¬²ÉÓÃËÞÖ÷»úÔËÐУ¬²¶»ñÊý¾Ý£¬¹ØÁªµ½DockerÈÝÆ÷£¬Éϱ¨µ½ÈÕÖ¾ÖÐÐĵÄ×ö·¨À´ÊµÏÖ¡£
Óöµ½µÄÎÊÌâ
ÄÚºËNetlink·¢ËÍÊý¾Ý¿¨×¡
Äں˷µ»ØÊý¾ÝÌ«¿ì£¬Óû§Ì¬ParseNetlinkMessage½âÎö¶Áȡ̫Âý£¬µ¼ÖÂÓû§Ì¬ÍøÂçBuffÕ¼Âú£¬Äں˲»ÔÙ·¢ËÍÊý¾Ý¸øÓû§Ì¬£¬½ø³Ì¿ÕÏС£¶ÔÓÚÕâ¸öÎÊÌ⣬ÎÒÃÇÔÚÓû§Ì¬×öÁ˶ÓÁпØÖÆ£¬È·±£½âÎöʱ¼äµÄÎÊÌâ²»»áÓ°Ïìµ½Äں˷¢ËÍÊý¾Ý¡£¶ÔÓÚ¶ÓÁеij¤¶È£¬ÎÒÃÇ×öÁ˶¨ÖµÏÞÖÆ£¬Éú²úËÙ¶È´óÓÚÏû·ÑËٶȵϰ£¬¿ÉÒÔ¶ªÆúһЩÊý¾Ý£¬À´±£Ö¤ÒµÎñÕý³£ÔËÐУ¬²¢ÇÒÀ´¿ØÖƽø³ÌµÄÄÚ´æÔö³¤ÎÊÌâ¡£
ÒÉËÆ¡°ÄÚ´æÐ¹Â¶¡±ÎÊÌâ
ÔÚһ̨DockerµÄËÞÖ÷»úÉÏ£¬ÔËÐÐÁË50¸öDockerʵÀý£¬Ã¿¸öDocker¶¼ÔËÐÐÁ˸´ÔÓµÄÒµÎñ³¡¾°£¬Æµ·±µÄ´´½¨½ø³Ì£¬ÔÚ×î³õµÄ²úƷʵÏÖÉÏ£¬Æô¶¯Ê±´óÔ¼10MÄÚ´æÕ¼Óã¬Ò»Ììºó´ïµ½200MµÄÇé¿ö¡£
¾¹ýÎÒÃÇDebug·ÖÎö·¢ÏÖ£¬ÔÚParseNetlinkMessage´¦ÀíÄں˷¢³öµÄÏûϢʱ£¬PIDƵ·±´´½¨´øÀ´ÄÚ´æÆµ·±ÉêÇ룬¶ÔÏ󯵷±ÊµÀý»¯£¬Õ¼ÓôóÁ¿Äڴ档ͬʱ£¬ÔÚGolang
GCʱ£¬É¨Ãè¡¢ÇåÀí¶¯×÷´øÀ´´óÁ¿CPUÏûºÄ¡£ÔÚ´úÂëÖУ¬·¢ÏÖ¶ÔÓÚlinux/connector.hÀïµÄstruct
cb_msg¡¢linux/cn_proc.hÀïµÄstruct proc_event½á¹¹Ì寵·±´´½¨£¬´øÀ´ÄÚ´æÉêÇëµÈÎÊÌ⣬ÒÔ¼°GolangµÄGCÌØÐÔ£¬ÄÚ´æÉêÇëºó£¬²»»áÔÚGCʱÁ¢¿Ì¹é»¹²Ù×÷ϵͳ£¬¶øÊÇÔÚºǫ́ÈÎÎñÀÖ𽥵Ĺ黹µ½²Ù×÷ϵͳ£¬¼û£ºdebug.FreeOSMemory
FreeOSMemory
forces a garbage collection followed by an attempt
to return as much memory to the operating system
as possible. (Even if this is not called, the
runtime gradually returns memory to the operating
system in a background task.)
|
µ«ÔÚÕâ¸öÒµÎñ³¡¾°À´óÁ¿Æµ·±µÄ´´½¨PID£¬Æµ·±µÄÉêÇëÄڴ棬´´½¨¶ÔÏó£¬ÄÇôÉêÇëËÙ¶ÈÔ¶Ô¶´óÓÚÊÍ·ÅËÙ¶È£¬×ÔÈ»ÄÚ´æ¾ÍÒ»Ö±¶Ñ»ý¡£
´ÓÎĵµÖпÉÒÔ¿´³ö£¬FreeOSMemoryµÄ·½·¨¿ÉÒÔ½«ÄÚ´æ¹é»¹¸ø²Ù×÷ϵͳ£¬µ«ÎÒÃDz¢Ã»ÓвÉÓÃÕâÖÖ·½°¸£¬ÒòΪËüÖα겻Öα¾£¬Ã»·¨½â¾öÄÚ´æÆµ·±ÉêÇëÆµ·±´´½¨µÄÎÊÌ⣬Ҳ²»ÄܽµµÍCPUʹÓÃÂÊ¡£
ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃDzÉÓÃÁËsync.PoolµÄÄÚÖöÔÏ󳨷½Ê½£¬À´¸´ÓûØÊÕ¶ÔÏ󣬱ÜÃâ¶ÔÏ󯵷±´´½¨£¬¼õÉÙÄÚ´æÕ¼ÓÃÇé¿ö£¬ÔÚÕë¶Ô¼¸¸öƵ·±´´½¨µÄ¶ÔÏó×ö¶ÔÏ󳨻¯ºó£¬Í¬ÑùµÄ²âÊÔ»·¾³£¬ÄÚ´æÎȶ¨¿ØÖÆÔÚ15M×óÓÒ¡£
´óÁ¿¶ÔÏóµÄ¸´Óã¬Ò²¼õÉÙÁ˶ÔÏóµÄÊýÁ¿£¬Í¬ÑùµÄ£¬ÔÚGolang GCÔËÐÐʱ£¬Ò²¼õÉÙÁ˶ÔÏóµÄɨÃèÊýÁ¿¡¢»ØÊÕÊýÁ¿£¬½µµÍÁËCPUʹÓÃÂÊ¡£
ÏîÄ¿½øÕ¹
ÔÚ²úÆ·µÄÑз¢¹ý³ÌÖУ¬Ò²Óöµ½ÁËһЩÎÊÌ⣬±ÈÈ磺
1.etcd Client Lease KeepaliveµÄBug¡£
2.Agent½ø³Ì×ÊÔ´ÏÞÖÆµÄCgroup´¥·¢¼¸´ÎÄÚºËBug¡£
3.DockerËÞÖ÷»úÉÏ˲ʱ´óÁ¿½ø³Ì´´½¨µÄÐÔÄÜÎÊÌâ¡£
4.ÍøÂç¼à¿ØÄ£¿éÔÚ´¦ÀíNginx·´Ïò´úÀíʱ£¬¶¯éü¼¸Ê®ÍòTCPÁ´½ÓµÄÍøÂçÊý¾Ý»ñȡѹÁ¦¡£
5.¸ö±ð½ø³Ì´ò¿ªÁË10WÒÔÉϵÄfd¡£
·½·¨Ò»¶¨±ÈÀ§ÄѶ࣬µ«·½·¨²»ÊÇÅÄÄÔ´üÏë³öÀ´µÄ£¬Ò»¶¨ÒªÉîÈë̽Ë÷ÎÊÌâµÄ¸ù±¾ÔÒò£¬ÕÒµ½ÏµÍ³ÐÔµÄÐÞ¸´·½·¨£¬¾ß±¸¸ß¿ÉÓᢸßÐÔÄÜ¡¢¼à¿Ø¸æ¾¯¡¢ÈÛ¶ÏÏÞÁ÷µÈ¹¦Äܺ󣬶ÔÓÚ³öÏÖµÄÎÊÌ⣬Äܹ»Ìáǰ·¢ÏÖ£¬½«¹ÊÕÏÓ°Ïì×îС»¯£¬Ìáǰ×ö´¦Àí¡£ÔÚÓ¦¶Ô²úÆ·ÔËÓª¹ý³ÌÖÐÓöµ½µÄ¸÷ÖÖÎÊÌâʱ£¬·êɽ¿ªÂ·£¬ÓöË®´îÇÅ£¬¶¼¿ÉÒÔ´ÓÈݵÄÓ¦¶Ô¡£
¾¹ýÎÒÃÇÒ»ÄêµÄŬÁ¦£¬ÒѾ²¿ÊðÁ˳ýÁ˸ö±ðÌØÊâÒµÎñÏßÖ®ÍâµÄÆäËûËùÓзþÎñÆ÷£¬ÊýÁ¿´ï¼¸Ê®Íǫ̀£¬²úÆ·Îȶ¨ÔËÐС£ÔÚÊý¾ÝÍêÕûÐÔ¡¢×¼È·ÐÔÉÏ£¬»¹ÓдýÌá¸ß£¬ÔÚ¾«Ï¸»¯ÔËÓªÉÏ£¬ÐèÒª¶à×ö¸Ä½ø¡£
±¾Æª¸ü¶àµÄÊÇÑз¢½Ç¶ÈÉÏÈí¼þ¼Ü¹¹ÉϵÄÉè¼Æ£¬¹ØÓÚ°²È«Ê¼þ·ÖÎö¡¢Êý¾Ý½¨Ä£¡¢ÔËÓª²ßÂԵȷ½ÃæµÄ¾ÑéºÍ¼¼ÇÉ£¬Î´À´½«»áÓÉÆäËûͬѧ½øÐзÖÏí£¬¾´ÇëÆÚ´ý¡£
×ܽá
ÎÒÃÇÔÚÑз¢Õâ¿î²úÆ·¹ý³ÌÖУ¬Ò²¿´µ½ÁËÍøÉÏ¿ªÔ´Á˼¸¿îͬÀà²úÆ·£¬Ò²Á˽âÁËËûÃǵÄÉè¼ÆË¼Â·£¬·¢Ïֺܶà²úÆ·¶¼ÊǰÑÖ÷Òª·½Ïò·ÅÔÚÁ˵¥¸öÄ£¿éµÄʵÏÖÉÏ£¬¶øºöÂÔÁ˲úÆ·¼Ü¹¹ÉϵÄÖØÒªÐÔ¡£
±ÈÈ磬ÓеIJúƷʹÓÃÁËsyscall hookÕâÖÖÇÖÈëÐԸߵķ½°¸À´±£ÕÏÊý¾ÝÍêÕûÐÔ£¬Ê¹µÃ¶ÔϵͳÇÖÈëÐԷdz£¸ß£¬Hook´úÂëµÄÎȶ¨ÐÔ£¬Ò²ÑÏÖØÓ°ÏìÁ˲Ù×÷ϵͳÄں˵ÄÎȶ¨¡£Í¬Ê±£¬Hook´úÂëҲȱÉÙÁË¼à¿ØÈ۶ϵĴëÊ©£¬ÔÚ¼¸Ê®Íò·þÎñÆ÷¹æÄ£µÄ³¡¾°Ï²¿Êð£¬Ç±ÔڵķçÏÕ¿ÉÄÜÈð²È«²¿ÃÅÎÞ·¨½ÓÊÜ£¬ÉõÖÁÊÇÖÂÃüµÄ¡£
ÕâÖÖÉè¼Æ£¬¿ÉÄÜÔÚ·þÎñÆ÷Á¿¼¶Ð¡Ê±£¬¶ÔÓÚ³öÏÖµÄÎÊÌâ¶à»¨µãʱ¼äÒ²ÄÜÖð¸ö½øÐÐά»¤£¬µ«Ó¦¶Ô¼¸Ê®ÍòÉõÖÁÉϰÙÍǫ̀·þÎñÆ÷ʱ£¬¶Ôά»¤³É±¾¡¢Îȶ¨ÐÔ¡¢¼à¿ØÈ۶ϵȶ¼ÊǺܴóµÄ¼¼ÊõÌôÕ½¡£Í¬Ê±£¬ÔÚÑз¢ÉÏ£¬Ò²ºÜÄÑʵÏÖ²úÆ·µÄ¿ìËÙµü´ú£¬¶øÕâÖÖ·½Ê½´øÀ´µÄÓ°Ï죬¼¸ºõ¶¼»áµ¼ÖÂÄÚºËå´»úÖ®ÀàÖÂÃüÎÊÌâ¡£ÕâÖÖʹʣ¬Ê¹Ó÷þÎñÆ÷µÄÒµÎñ·½ºÜÄѽøÐнÓÊÜ£¬ÊƱػáÓ°Ïì²úÆ·µÄÑз¢ËÙ¶È¡¢ÍƽøËÙ¶È£»Ó°ÏìͬÊ£¨SREÔËάµÈ£©¶Ô²úÆ·µÄÐÅÐÄ£¬½ø¶ø¶ÔºóÐø²úÆ·µÄÍÆ½ø´øÀ´ºÜ´óµÄ×èÁ¦¡£
|